1 VÉRIFICATION ET VALIDATION RCBA - DONNÉES D’HABITAT

Environnement et changement climatique Canada

Analyse réalisée le 2018-02-26 15:51:57


Ce document est un carnet de note écrit en Markdown R. Lorsque vous éxécuter le code intégré au carnet, les résulats apparaitront sous le code correspondant.

Ce rapport présente les résultats de la vérification et la validation des données d’habitat pour le projet TestFr.

Dans cette analyse, le jeu de descripteurs d’habitat sera vérifié pour répondre à la question suivante :

  • Les données d’habitat correspondent-elles bien à ce qui a été observé sur le terrain ?

Ce document est un carnet de notes R Markdown. Pour obtenir les résultats de la vérification et la validation des données, exécutez les commandes contenues dans ce carnet de notes. Pour ce faire, positionnez votre curseur à l’intérieur d’une boîte de commandes et cliquez sur la flèche verte à la droite de celle-ci nommée Run Current Chunk ou appuyez sur les touches Ctrl+Maj+Entrée (Cmd-Maj+Entrée sur macOS) de votre clavier. Répétez pour chaque boîte de commandes. À mesure que les commandes contenues dans ce carnet seront exécutées, les résultats apparaîtront sous chacune des commandes correspondantes dans la présente fenêtre. Une fois toutes les commandes exécutées, cliquez sur le bouton Preview en haut à gauche de la présente fenêtre ou appuyer sur les touches Ctrl+Maj+K. Une nouvelle fenêtre apparaîtra et contiendra le rapport de ces résultats de la vérification et la validation des données générales RCBA.

1.1 Prérequis

Ce carnet suppose que vous avez importé vos données dans R en utilisant le carnet d’importation de données (AED_Importation.Rmd).

Le fichier contenant les donneés d’habitat de ce projet est présent.

1.2 Statistiques descriptives

Le fichier de données contient 458 visites (lignes) et 89 taxons (colonnes).

Le tableau suivant présente une partie des données du fichier.

Lecture des données d’habitat

ACTION: Vérifiez les données et assurez-vous que cela réflète bien la réalité. Examinez particulièrement les éléments suivants:

  • Le fichier semble-t’il avoir été lu correctement?
  • Des colonnes sont-elles manquantes?

Liste des visites présentes dans les données d’habitat (ID provenant de la base de données RCBA) :

17215, 17216, 17217, 18368, 18375, 18364, 18493, 18495, 18496, 18758, 18759, 18760, 18546, 18548, 18549, 19013, 19017, 19018, 16962, 16965, 16966, 17363, 17364, 17365, 18839, 18841, 18845, 17492, 17493, 17494, 21911, 21925, 21926, 18328, 18329, 18330, 19971, 20219, 18632, 20220, 18628, 18630, 18631, 17496, 17497, 17498, 18889, 18890, 18892, 20302, 21710, 20303, 20304, 18663, 18664, 18665, 16863, 18796, 18798, 18799, 19070, 19072, 19082, 18718, 18723, 18724, 17241, 17248, 17253, 18693, 18826, 19044, 26231, 16828, 17272, 17273, 17274, 18787, 18790, 18791, 17522, 17568, 17573, 17436, 17437, 17438, 18378, 18449, 18459, 24059, 17450, 17456, 17461, 18747, 18748, 18750, 19104, 18730, 18732, 18734, 16913, 16914, 16919, 18300, 18301, 18302, 18499, 18498, 18497, 16921, 16922, 16923, 18296, 18298, 18299, 16849, 16853, 16854, 17412, 17413, 17418, 18545, 18735, 18736, 18667, 18678, 18692, 18666, 18681, 18682, 17502, 17565, 17570, 18622, 18623, 18624, 18821, 18823, 18824, 19037, 19042, 19043, 18542, 18543, 18544, 18901, 18903, 18904, 21846, 21850, 21854, 19045, 19046, 19048, 18331, 18332, 18333, 19103, 19038, 19040, 19041, 19069, 19073, 19084, 16997, 18757, 18830, 18832, 18610, 18611, 18616, 17472, 17476, 17477, 19086, 19087, 19088, 18891, 18893, 18899, 18753, 18777, 18780, 17463, 17465, 17466, 18828, 18829, 18894, 18803, 18805, 18806, 17488, 17490, 17491, 17569, 17575, 17578, 18922, 18977, 18996, 18923, 18927, 18929, 18482, 18483, 18484, 19015, 19016, 19014, 16934, 16935, 16936, 28210, 28212, 28213, 29505, 29506, 29507, 19033, 19035, 19036, 19075, 19077, 19078, 18475, 18479, 18480, 18453, 18454, 18455, 19094, 19096, 19098, 16907, 16908, 16911, 18661, 18662, 18782, 18743, 18770, 18774, 18711, 18716, 18717, 16867, 16868, 16866, 18695, 18696, 18766, 18655, 18658, 18659, 18763, 18768, 18769, 18520, 18524, 18525, 17483, 17487, 17489, 18772, 18773, 18775, 16945, 16961, 16967, 18644, 18669, 18677, 16834, 16833, 16832, 18843, 18844, 18846, 18701, 18702, 18703, 18687, 18689, 18691, 18800, 18801, 18802, 18519, 18522, 18523, 18372, 18373, 18374, 18647, 18648, 18649, 18618, 18619, 18620, 18476, 18477, 18478, 19002, 19049, 19011, 28315, 28316, 28317, 18785, 18786, 18789, 21909, 26432, 19089, 19090, 19091, 16852, 16858, 16859, 17289, 17597, 17595, 18450, 18451, 18452, 18868, 18895, 18896, 19101, 16898, 16903, 16900, 16893, 16991, 16992, 18674, 18676, 18679, 20305, 20307, 20308, 18604, 18605, 18606, 18607, 18602, 18719, 18720, 18721, 19547, 19548, 18456, 18457, 18458, 18468, 18469, 18470, 18461, 18463, 18464, 19079, 19080, 19083, 18781, 18850, 18851, 18783, 18835, 18842, 18994, 19001, 19004, 18836, 18837, 18838, 18516, 18538, 18541, 19071, 19076, 19093, 16839, 16840, 16844, 17471, 17475, 17478, 19102, 16841, 16843, 16845, 17479, 17481, 17482, 16860, 16861, 16862, 18722, 18725, 18726, 17571, 17572, 17574, 21967, 21973, 21975, 19064, 19067, 19092, 17126, 17132, 17133, 18937, 18938, 18939, 18361, 18362, 18363, 19068, 19074, 19085, 16927, 16928, 16929, 16836, 16837, 16838, 18792, 18793, 18795, 16924, 16925, 16926, 17390, 17393, 17394, 16905, 16915, 16916, 18365, 18366, 18367, 18303, 18305, 18306, 26032, 26033, 26036, 18737, 18740, 18741, 21950, 21963, 21977, 18756, 18761, 18762

ACTION: *Vérifiez les données et assurez-vous que cela réflète bien la réalité. Comparez la liste ci-haut avec le tableau suivant qui présente les visites présentes dans l’un ou l’autre des fichiers de données pour vous assurez que tout est adéquat.

Site SampleDate SampleNumber
17215 AA06221 2008-09-30 1
17216 AA06222 2008-09-29 1
17217 AA06223 2008-09-28 1
18368 AA09211 2008-09-30 1
18375 AA09212 2008-09-29 1
18364 AA09213 2008-09-28 1
18493 AB02061 2008-09-30 1
18495 AB02062 2008-09-29 1
18496 AB02063 2008-09-28 1
18758 AB05291 2008-09-30 1
18759 AB05292 2008-09-29 1
18760 AB05293 2008-09-28 1
18546 AC09201 2008-09-30 1
18548 AC09202 2008-09-29 1
18549 AC09203 2008-09-28 1
19013 AG03041 2008-09-30 1
19017 AG03042 2008-09-29 1
19018 AG03043 2008-09-28 1
16962 AJ08031 2008-09-30 1
16965 AJ08032 2008-09-29 1
16966 AJ08033 2008-09-28 1
17363 AKN04261 2008-09-30 1
17364 AKN04262 2008-09-29 1
17365 AKN04263 2008-09-28 1
18839 AM05271 2008-09-30 1
18841 AM05272 2008-09-29 1
18845 AM05273 2008-09-28 1
17492 AMI05221 2008-09-30 1
17493 AMI05222 2008-09-29 1
17494 AMI05223 2008-09-28 1
21911 AP04131 2008-09-30 1
21925 AP04132 2008-09-29 1
21926 AP04133 2009-09-28 1
18328 AP04181 2008-09-30 1
18329 AP04182 2008-09-29 1
18330 AP04183 2008-09-28 1
19971 AR092808 2008-09-28 1
20219 AR092908 2008-09-29 1
18632 AR09292 2008-09-29 1
20220 AR093008 2008-09-30 1
18628 AS09051 2008-09-30 1
18630 AS09052 2008-09-29 1
18631 AS09053 2008-09-28 1
17496 AS09191 2008-09-30 1
17497 AS09192 2008-09-29 1
17498 AS09193 2008-09-28 1
18889 AT05101 2008-09-30 1
18890 AT05102 2008-09-29 1
18892 AT05103 2008-09-28 1
20302 BH12261 2008-09-30 1
20303 BH12262 2008-09-29 1
20304 BH12263 2008-09-28 1
18663 BL110801 2008-09-30 1
18664 BL110802 2008-09-29 1
18665 BL110803 2008-09-28 1
16863 BR06231 2008-09-30 1
18796 BS07281 2008-09-30 1
18798 BS07282 2008-09-29 1
18799 BS07283 2008-09-28 1
19070 BT11071 2008-09-30 1
19072 BT11072 2008-09-29 1
19082 BT11073 2008-09-28 1
18718 BW09191 2008-09-30 1
18723 BW09192 2008-09-29 1
18724 BW09193 2008-09-28 1
17241 BW10111 2008-09-30 1
17248 BW10112 2008-09-29 1
17253 BW10113 2008-09-28 1
18693 BY05231 2008-09-30 1
18826 BY05232 2008-09-29 1
19044 BY05233 2008-09-28 1
17272 CD01231 2008-09-30 1
17273 CD01232 2008-09-29 1
17274 CD01233 2008-09-28 1
18787 CD08121 2008-09-30 1
18790 CD08122 2008-09-29 1
18791 CD08123 2008-09-28 1
17522 CD10141 2008-09-29 1
17568 CD10142 2008-09-29 1
17573 CD10143 2008-09-28 1
17436 CD10161 2008-09-30 1
17437 CD10162 2008-09-29 1
17438 CD10163 2008-09-28 1
18378 CG03161 2008-09-30 1
18449 CG03162 2008-09-29 1
18459 CG03163 2008-09-28 1
24059 CG08121 2008-09-30 1
17450 CH04191 2008-09-30 1
17456 CH04192 2008-09-29 1
17461 CH04193 2008-09-28 1
18747 CJ9271 2008-09-30 1
18748 CJ9272 2008-09-29 1
18750 CJ9273 2008-09-28 1
18730 CM05221 2008-09-30 1
18732 CM05222 2008-09-29 1
18734 CM05223 2008-09-28 1
16913 CM10301 2008-09-30 1
16914 CM10302 2008-09-29 1
16919 CM10303 2008-09-28 1
18300 CMH04191 2008-09-30 1
18301 CMH04192 2008-09-29 1
18302 CMH04193 2008-09-28 1
18499 CN09021 2008-09-30 1
18498 CN09022 2008-09-29 1
18497 CN09023 2008-09-28 1
16921 CO04141 2008-09-30 1
16922 CO04142 2008-09-29 1
16923 CO04143 2008-09-28 1
18296 CS08311 2008-09-30 1
18298 CS08312 2008-09-29 1
18299 CS08313 2008-09-28 1
16849 CT11041 2008-09-30 1
16853 CT11042 2008-09-29 1
16854 CT11043 2008-09-28 1
17412 DE06091 2008-09-30 1
17413 DE06092 2008-09-29 1
17418 DE06093 2008-09-28 1
18545 DJ0906101 2008-09-30 1
18735 DJ09062 2008-09-29 1
18736 DJ09063 2008-09-28 1
18667 DM04041 2008-09-30 1
18678 Dm04042 2008-09-29 1
18692 DM04043 2008-09-28 1
18666 DR06151 2008-09-30 1
18681 DR06152 2008-09-29 1
18682 DR06153 2008-09-28 1
17502 DS06121 2008-09-30 1
17565 DS06122 2008-09-29 1
17570 DS06123 2008-09-28 1
18622 DT06091 2008-09-30 1
18623 DT06092 2008-09-29 1
18624 DT06093 2008-09-28 1
18821 DW01311 2008-09-30 1
18823 DW01312 2008-09-29 1
18824 DW01313 2008-09-28 1
19037 EE06181 2008-09-30 1
19042 EE06182 2008-09-29 1
19043 EE06183 2008-09-28 1
18542 EJ12211 2008-09-30 1
18543 EJ12212 2008-09-29 1
18544 EJ12213 2008-09-28 1
17443 EK07041 2008-09-30 1
17444 EK07042 2008-09-29 1
18901 ER07011 2008-09-30 1
18903 ER07012 2008-09-29 1
18904 ER07013 2008-09-28 1
21846 ES06091 2008-09-30 1
21850 ES06092 2008-09-29 1
21854 ES06093 2008-09-28 1
19045 ES11131 2008-09-30 1
19046 ES11132 2008-09-29 1
19048 ES11133 2008-09-28 1
18331 EW03271 2008-09-30 1
18332 EW03272 2008-09-29 1
18333 EW03273 2008-09-28 1
19038 GH03161 2008-09-30 1
19040 GH03162 2008-09-29 1
19041 GH03163 2008-09-28 1
19069 GL05231 2008-09-30 1
19073 GL05232 2008-09-29 1
19084 GL05233 2008-09-28 1
18757 HK09283 2008-09-30 1
18830 HK09292 2008-09-29 1
18832 HK09301 2008-09-30 1
18610 HM02271 2008-09-30 1
18611 HM02272 2008-09-29 1
18616 HM02273 2008-09-28 1
17472 JB09271 2008-09-30 1
17476 JB09272 2008-09-29 1
17477 JB09273 2008-09-28 1
19086 JB12071 2008-09-30 1
19087 JB12072 2008-09-29 1
19088 JB12073 2008-09-28 1
18891 JB12251 2008-09-30 1
18893 JB12252 2008-09-29 1
18899 JB12253 2008-09-28 1
18753 JC051401 2008-09-30 1
18777 JC051402 2008-09-29 1
18780 JC051403 2008-09-28 1
17463 JD03231 2008-09-30 1
17465 JD03232 2008-09-29 1
17466 JD03233 2008-09-28 1
18828 JD10191 2008-09-30 1
18829 JD10192 2008-09-29 1
18894 JD10193 2008-09-28 1
18803 JJ03271 2008-09-30 1
18805 JJ03272 2008-09-29 1
18806 JJ03273 2008-09-28 1
17488 JJ06301 2008-09-30 1
17490 JJ06302 2008-09-29 1
17491 JJ06303 2008-09-28 1
17569 JL02061 2008-09-30 1
17575 JL02062 2008-09-29 1
17578 JL02063 2008-09-28 1
18922 JL09091 2008-09-30 1
18977 JL09092 2008-09-29 1
18996 JL09093 2008-09-28 1
18923 JM04621 2008-09-30 1
18927 JM04622 2008-09-29 1
18929 JM04623 2008-09-28 1
18482 JM11131 2008-09-30 1
18483 JM11132 2008-09-29 1
18484 JM11133 2008-09-28 1
19015 JP03271 2008-09-30 1
19016 JP03272 2008-09-29 1
19014 JP03273 2008-09-28 1
16934 JR02121 2008-09-30 1
16935 JR02122 2008-09-29 1
16936 JR02123 2008-09-28 1
28210 JR03271 2008-09-30 1
28212 JR03272 2008-09-29 1
28213 JR03273 2008-09-28 1
29505 JR12091 2008-09-30 1
29506 JR12092 2008-09-29 1
29507 JR12093 2008-09-28 1
19033 JR12211 2008-09-30 1
19035 JR12212 2008-09-29 1
19036 JR12213 2008-09-28 1
19075 JS10011 2008-09-30 1
19077 JS10012 2008-09-29 1
19078 JS10013 2008-09-28 1
18475 JS11111 2008-09-30 1
18479 JS11112 2008-09-29 1
18480 JS11113 2008-09-28 1
18453 JT05241 2008-09-30 1
18454 JT05242 2008-09-29 1
18455 JT05243 2008-09-28 1
19094 JT09091 2008-09-30 1
19096 JT09092 2008-09-29 1
19098 JT09093 2008-09-28 1
16907 KC10081 2008-09-30 1
16908 KC10082 2008-09-29 1
16911 KC10083 2008-09-28 1
18661 KC12141 2008-09-30 1
18662 KC12142 2008-09-29 1
18782 KC12143 2008-09-28 1
18743 KF06181 2008-09-30 1
18770 KF06182 2008-09-29 1
18774 KF06183 2008-09-28 1
18711 KK01041 2008-09-30 1
18716 KK01042 2008-09-29 1
18717 KK01043 2008-09-28 1
16867 KL08312 2008-09-29 1
16868 KL08313 2008-09-28 1
16866 KL09301 2008-09-30 1
18695 KM01051 2008-09-30 1
18696 KM01052 2008-09-29 1
18766 KM01053 2008-09-28 1
18655 KM03021 2008-09-30 1
18658 KM03022 2011-09-29 1
18659 KM03023 2008-09-28 1
18763 km07061 2008-09-30 1
18768 km07062 2008-09-29 1
18769 km07063 2008-09-28 1
18520 KM07121 2008-09-30 1
18524 KM07122 2008-09-29 1
18525 KM07123 2008-09-28 1
17483 KM1221 2008-09-30 1
17487 KM1222 2008-09-29 1
17489 KM1223 2008-09-28 1
18772 KP03021 2008-09-30 1
18773 KP03022 2008-09-29 1
18775 KP03023 2008-09-28 1
16945 KR04191 2008-09-30 1
16961 KR04192 2008-09-29 1
16967 KR04193 2008-09-28 1
18644 KR09021 2008-09-30 1
18669 KR09022 2008-09-29 1
18677 KR09023 2008-09-28 1
16834 KV12191 2008-09-30 1
18310 KV12191 2010-09-15 1
16833 KV12192 2008-09-29 1
16832 KV12193 2008-09-28 1
18843 kw01011 2008-09-30 1
18844 kw01012 2008-09-29 1
18846 kw01013 2008-09-28 1
18701 LC03051 2008-09-30 1
18702 LC03052 2008-09-29 1
18703 LC03053 2008-09-28 1
18687 LC10141 2008-09-30 1
18689 LC10142 2008-09-29 1
18691 LC10143 2008-09-28 1
18800 LL10171 2008-09-30 1
18801 LL10172 2008-09-29 1
18802 LL10173 2008-09-28 1
18519 LN03171 2008-09-30 1
18522 LN03172 2008-09-29 1
18523 LN03173 2008-09-28 1
18372 LP06091 2008-09-30 1
18373 LP06092 2008-09-29 1
18374 LP06093 2008-09-28 1
18647 LR01081 2008-09-30 1
18648 LR01082 2008-09-29 1
18649 LR01083 2008-09-28 1
18618 ls05031 2008-09-30 1
18619 ls05032 2008-09-29 1
18620 ls05033 2008-09-28 1
18476 LS10231 2008-09-30 1
18477 LS10232 2008-09-29 1
18478 LS10233 2008-09-28 1
19002 ma08051 2008-09-30 1
19049 ma08052 2008-09-29 1
19011 ma08053 2008-09-28 1
28315 MC12281 2008-09-30 1
28316 MC12282 2008-09-29 1
28317 MC12283 2008-09-28 1
18785 ME08161 2008-09-30 1
18786 ME08162 2008-09-29 1
18789 ME08163 2008-09-28 1
21909 MG09031 2012-12-12 1
19089 MG12281 2008-09-30 1
19090 MG12282 2008-09-29 1
19091 MG12283 2008-09-28 1
16852 MH02261 2008-09-30 1
16858 MH02262 2008-09-29 1
16859 MH02263 2008-09-28 1
17591 MH06142 2008-09-29 1
17597 MH06143 2008-09-28 1
18450 MJ06091 2008-09-30 1
18451 MJ06092 2008-09-29 1
18452 MJ06093 2008-09-28 1
18868 MJ09251 2008-09-30 1
18895 MJ09252 2008-09-29 1
18896 MJ09253 2008-09-28 1
19101 ML04041 2008-09-30 1
16898 ML05021 2008-09-30 1
16903 ML05022 2008-09-29 1
16900 ML05023 2008-09-28 1
16893 ml12221 2008-09-30 1
16991 ml12222 2008-09-29 1
16992 ml12223 2008-09-28 1
18674 MM08081 2008-09-30 1
18676 MM08082 2008-09-29 1
18679 MM08083 2008-09-28 1
20305 MR08101 2008-09-30 1
20307 MR08102 2008-09-29 1
20308 MR08103 2008-09-28 1
18719 MW07101 2008-09-30 1
18720 MW07102 2008-09-29 1
18721 MW07103 2008-09-28 1
19547 MWLMCExp 2011-09-14 1
19548 MWLWCRef 2011-09-11 1
18456 NB10251 2008-09-30 1
18457 NB10252 2008-09-29 1
18458 NB10253 2008-09-28 1
18468 NG04251 2008-09-30 1
18469 NG04252 2008-09-29 1
18470 NG04253 2008-09-28 1
18461 NM10231 2008-09-30 1
18463 NM10232 2008-09-29 1
18464 NM10233 2008-09-28 1
19079 NP03311 2008-09-30 1
19080 NP03312 2008-09-29 1
19083 NP03313 2008-09-28 1
18781 NY01031 2008-09-30 1
18850 NY01032 2008-09-29 1
18851 NY01033 2008-09-28 1
18783 PC09211 2008-09-30 1
18835 PC09212 2008-09-29 1
18842 PC09213 2008-09-28 1
18994 PD03181 2008-09-30 1
19001 PD03182 2008-09-29 1
19004 PD03183 2008-09-28 1
18836 PE05051 2008-09-30 1
18837 PE05052 2008-09-29 1
18838 PE05053 2008-09-28 1
18516 PJ05151 2008-09-30 1
18538 PJ05152 2008-09-29 1
18541 PJ05153 2008-09-28 1
19071 PM02041 2008-09-30 1
19076 PM02042 2008-09-29 1
19093 PM02043 2008-09-28 1
16839 ps11141 2008-09-30 1
16840 ps11142 2008-09-29 1
16844 ps11143 2008-09-28 1
17471 PV02041 2008-09-30 1
17475 PV02042 2008-09-29 1
17478 PV02043 2008-09-28 1
16841 RB03091 2008-09-30 1
16843 RB03092 2008-09-29 1
16845 RB03093 2008-09-28 1
17479 RC06231 2008-09-30 1
17481 RC06232 2008-09-29 1
17482 RC06233 2008-09-28 1
16860 RG09061 2008-09-30 1
16861 RG09062 2008-09-29 1
16862 RG09063 2008-09-28 1
18722 RK06241 2008-09-30 1
18725 RK06242 2008-09-29 1
18726 RK06243 2008-09-28 1
17571 RR06231 2008-09-30 1
17572 RR06232 2008-09-29 1
17574 RR06233 2008-09-28 1
21967 RR10111 2008-09-30 1
21973 RR10112 2008-09-29 1
21975 RR10113 2008-09-28 1
19064 SAD01171 2008-09-30 1
19067 SAD01172 2008-09-29 1
19092 SAD01173 2008-09-28 1
17126 sb03291 2008-09-30 1
17132 sb03292 2008-09-29 1
17133 sb03293 2008-09-28 1
18937 SG11141 2008-09-30 1
18938 SG11142 2008-09-29 1
18939 SG11143 2008-09-28 1
18807 Site2 2011-01-01 1
18361 SJ10311 2008-09-30 1
18362 SJ10312 2008-09-29 1
18363 SJ10313 2008-09-28 1
19068 SM03261 2011-09-30 1
19074 SM03262 2008-09-29 1
19085 SM03263 2008-09-28 1
16927 SNE06041 2008-09-30 1
16928 SNE06042 2008-09-29 1
16929 SNE06043 2008-09-28 1
16836 SP12241 2008-09-30 1
16837 SP12242 2008-09-29 1
16838 SP12243 2008-09-28 1
18792 SR07151 2008-09-30 1
18793 SR07152 2008-09-29 1
18795 SR07153 2008-09-28 1
16924 SS05301 2008-09-30 1
16925 SS05302 2008-09-29 1
16926 SS05303 2008-09-28 1
17390 SS11171 2008-09-30 1
17393 SS11172 2008-09-29 1
17394 SS11173 2008-09-28 1
16905 TD10171 2008-09-30 1
16915 TD10172 2008-09-29 1
16916 TD10173 2008-09-28 1
18365 TH10061 2008-09-28 1
18366 TH10062 2008-09-29 1
18367 TH10063 2008-09-28 1
18303 TL04171 2008-09-30 1
18305 TL04172 2008-09-29 1
18306 TL04173 2008-09-28 1
26032 TP102801 2008-09-30 1
26033 TP102802 2008-09-29 1
26036 TP102803 2008-09-28 1
18737 VA03271 2008-09-30 1
18740 VA03272 2008-09-29 1
18741 VA03273 2008-09-28 1
21950 VE03051 2008-09-30 1
21963 VE03052 2008-09-29 1
21977 VE03053 2008-09-28 1
18756 ZD03171 2008-09-30 1
18761 ZD03172 2008-09-29 1
18762 ZD03173 2008-09-28 1
21710 bh12261 2008-09-30 1
26231 BY09291 2008-09-30 1
16828 CC05191 2008-09-30 1
19104 CLD01 2008-09-30 1
19103 FRS01 2008-09-29 1
16997 GL09301 2008-09-30 1
26432 MG09032 2012-12-09 1
17289 MH06141 2008-09-30 1
18604 Muskwa 406 2011-08-05 1
18605 Muskwa 423 2011-08-05 1
18606 Muskwa 424 2011-08-05 1
18607 Muskwa 425 2011-08-05 1
18602 Muskwa1 2011-08-04 1
19102 QNS-01 2008-09-28 1

Liste des variables :

Altitude, StreamOrder, DistanceFromSource, CH.Depth.Avg..cm., CH.Depth.BankfullMinusWetted..cm., CH.Depth.Max..cm., CH.Discharge..m.3.s., CH.Macrophyte..PercentRange., CH.Reach..CanopyCoverage..PercentRange., CH.Reach..Logging..PercentRange., CH.Reach.DomStreamsideVeg..Category..1.4.., CH.Reach.Pools..Binary., CH.Reach.Rapids..Binary., CH.Reach.Riffles..Binary., CH.Reach.StraightRun..Binary., CH.Slope..m.m., CH.Veg.Coniferous..Binary., CH.Veg.Deciduous..Binary., CH.Veg.GrassesFerns..Binary., CH.Veg.Shrubs..Binary., CH.Velocity.Avg..m.s., CH.Velocity.Max..m.s., CH.Width.Bankfull..m., CH.Width.Wetted..m., CH.XSEC.VelEquationSlope..m.3.rev., CH.XSEC.VelInstrumentDirect..Category..1.3.., CH.XSEC.VelMethod..Category..1.3.., CH.XSEC.VeloEquationIntercept..m.3.s., CL.Rainfall01_JAN..mm., CL.Rainfall06_JUN..mm., CL.Snowfall06_JUN..mm., CL.SnowfallTotal_ANNUAL..mm., CL.Temp01_JANMax..Degrees.Celsius., HY..Lake…., HY.Drainage.Area..km.2., HY.StreamDensity..m.km.2., LC.Reg.Alpine…., LC.Reg.Forest…., LC.Reg.Lake…., LC.Reg.UnregenForest…., LC.Reg.Wetland…., SD.Al..ppm., SD.As..ppm., SD.B..ppm., SD.Mg..ppm., SD.Ni..ppm., SU..Bedrock…., SU..Boulder…., SU..Cobble…., SU..Gravel…., SU..Pebble…., SU..Sand…., SU..Silt.Clay…., SU.D50..cm., SU.Dg..cm., SU.Dominant.1st..Category.0.9.., SU.Dominant.2nd..Category.0.9.., SU.Embeddedness..Category.1.5.., SU.PeriphytonCoverage..Category.1.5.., SU.SurroundingMaterial..Category.0.9.., TO.SlopeAvg…., WT.Ag..mg.L., WT.Al..mg.L., WT.Ba..mg.L., WT.CO3..mg.L., WT.General.Alkalinity..mg.L., WT.General.CarbonDOC..mg.L., WT.General.Colour..Unknown., WT.General.Conductivity..µS.cm., WT.General.DO..mg.L., WT.General.pH..pH., WT.General.SolidsTDS..mg.L., WT.General.SolidsTSS..mg.L., WT.General.SpCond..µS.cm., WT.General.TempAir..Degrees.Celsius., WT.General.TempWater..Degrees.Celsius., WT.General.Turbidity..NTU., WT.Ni..mg.L., WT.Nitrogen.NH3..mg.L., WT.Nitrogen.NO2..mg.L., WT.Nitrogen.NO2.NO3..mg.L., WT.Nitrogen.NO3..mg.L., WT.Nitrogen.TDN..mg.L., WT.Nitrogen.TN..mg.L., WT.Nitrogen.TN_Organic..mg.L., WT.Phosphorus.OrthoP..mg.L., WT.Phosphorus.TDP..mg.L., WT.Phosphorus.TP..mg.L., WT.S..mg.L.

ACTION: *Vérifiez les variables ci-haut et assurez-vous qu’elles sont toutes présentes.

1.2.1 Statistiques générales

Le tableau suivant présente les statistiques générales par variable. Lorsque le résultat obtenu à la ligne BinaryData du tableau est TRUE, cela indique que la variable présente des données binaires. Cependant, ce résultat peut également n’être obtenu que parce que la variable ne présente qu’une à deux données au maximum. La ligne Na.values indique le nombre de valeurs manquantes que présente chaque variable.

Tableau des statistiques générales

ACTION: *Vérifiez les données et assurez-vous qu’elles réflètent bien la réalité. Examinez les statistiques de base et identifiez, le cas échéant, des anomalies au niveaux des statistiques de base.

1.3 Localisation des données environnementales

1.3.1 Distribution géographique des variables d’habitat

Les graphiques suivants illustrent la position (latitude et longitude) ainsi que la valeur observée des variables dans le fichier de données d’habitat.

1.3.2 Cartographie de la distribution de l’altitude par site

La carte interactive suivante illustre la position des sites en fonction des coordonnées géographiques contenues dans le fichier de données ainsi que l’altitude par site. Cliquez sur le marqueur d’une visite pour indiquer l’altitude observée dans celle-ci.

1.4 Présence de données aberrantes

1.4.1 Dispersion des valeurs observées

Les diagrammes de dispersion suivants présentent la valeur des données de variables continues observées dans le fichier de données dans l’ordre à laquelle elles apparaissent dans ce fichier pour chaque variable. Sous l’axe des X se trouve l’identifiant de la visite vis-à-vis la valeur observée correspondante, soit le nom du site d’où provient la donnée, sa date d’échantillonnage et le nombre d’échantillonnage pris pour cette donnée.

ACTION: Vérifier les données et assurez-vous qu’elles réflètent bien la réalité. Examinez les points suivants :

  • Des données sortent-elles de l’ordinaire?

1.4.2 Boîtes à moustaches des valeurs observées et transformées

La première boîte à moustaches (à gauche) présentent la distribution des valeurs de variables continues observées dans le fichier de données et la deuxième boîte à moustaches (à droite) présentent la distribution des valeurs de variables continues observées ayant subies une transformation logarithmique.

ACTION: Vérifiez les données et assurez-vous que cela réflète bien la réalité. Examinez particulièrement les éléments suivants:

  • Des données semblent-elles sortir de l’ordinaire?

1.4.3 Identification des données aberrantes potentielles

La première boîte à moustaches (à gauche) présentent la distribution des valeurs de variables continues observées dans le fichier de données et le diagramme de dispersion (à droite) présentent la distribution des valeurs de variables continues observées dans l’ordre à laquelle elles apparaissent dans ce fichier. Les données présentant une identification par leur identifiant sur les diagrammes représentent les données potentiellement aberrantes contenues dans le fichier de données. La méthode utilisée pour identifier les données potentiellement aberrantes est l’étendue interquantile (Interquantile range ou IQR). L’IQR se calcule de la manière suivante :

IQR(x) = quantile(x, 3/4) - quantile(x, 1/4)

Les valeurs potentiellement aberrantes sont définies comme des observations qui se situent au-dessous de Q1 - 1,5 IQR ou plus de Q3 + 1,5 IQR.

L’identifiant de la visite correspond au nom du site d’où provient la donnée, sa date d’échantillonnage et le nombre d’échantillonnage pris pour cette donnée.

ACTION: Examinez les graphiques suivants et portez votre attention sur les points (si présents) auxquels un identifiant est associé. Posez-vous la question suivante :

  • Les données potentiellement aberrantes le sont-elles vraiment?

La liste suivante présente les données potentiellement aberrantes contenues dans le fichier de données pour chaque variable. Lorsque l’identifiant d’une donnée y est indiqué, cela indique que cette donnée représente une donnée potentiellement aberrante contenue dans le fichier de données. Les mentions “” indiquent les données non aberrantes et les mentions NA indiquent la présence de valeurs manquantes. L’identifiant de la visite correspond au nom du site d’où provient la donnée, sa date d’échantillonnage et le nombre d’échantillonnage pris pour cette donnée.

1.5 Normalité des données

1.5.1 Diagrammes Quantile-Quantile et histogrammes de fréquences

Pour chaque variable, le premier graphique (à gauche) illustre la distribution observée des valeurs par variable par des points et la distribution normale théorique calculée à partir des paramètres de la distribution observée par une droite. Plus les valeurs observées sont positionnées sur la droite, plus celles-ci sont distribuées selon la loi normale.

Le deuxième graphique (au milieu) illustre par un histogramme la distribution des fréquences des valeurs observées par taxon. Cet histogramme illustre également la valeur moyenne par variable par une ligne pleine ainsi que l’écart-type des variables par deux lignes pointillées.

Le troisième graphique (à droite) illustre la distribution des fréquences des valeurs observées par variable ayant subies une transformation logarithmique. Si la distribution des données sur ce dernier graphique semble ressembler davantage à une distribution normale, une transformation logarithmique des données pourrait être nécessaire. Cet histogramme illustre également la valeur moyenne par variable par une ligne pleine ainsi que l’écart-type des variables par deux lignes pointillées.

1.5.2 Boîtes à moustaches des valeurs observées par variable environnementale

Pour chaque variable, la première boîte à moustaches (à gauche) illustre la distribution des valeurs observées dans le fichier de données et la deuxième boîte à moustaches (à droite) illustre la distribution des valeurs observées dans le fichier de données ayant subies une transformation logarithmique.

1.5.3 Tests de normalité

Les résultats suivants présentent le résultat obtenu par un test de Snows appliqué sur chaque variable du fichier de données. Une valeur de P (p-value) inférieure à 0.05 indique qu’il n’est pas possible de supposer que la distribution des données suit la loi normale avec une probabilité de 95%.

1.6 Collinéarité des variables

1.6.1 Matrice de diagrammes de disperson

La matrice de diagrammes de dispersion suivante illustre la relation qui existe entre des pairs de variables. Elle permet notamment de détecter la présence de corrélations entre des variables.

1.6.2 Indépendance temporelle des variables

Pour chaque variable, le premier graphique (en haut à gauche) illustre la valeur observée des données selon leur année d’échantillonnage. Le deuxième graphique (en haut à droite) illustre les tendances observées de variations des valeurs des données dans le temps. Le troisième graphique (en bas à gauche) illustre les prévisions futures de variations des valeurs dans le temps. Sur ce graphique la ligne bleue correspond à la tendance attendue moyenne de variations dans le temps, la zone grise foncée correspond à un intervalle de confiance de 80% et la zone grise pâle correspond à un intervalle de confiance de 95%. Le quatrième graphique (en bas à droite) illustre l’autocorrélation de séries temporelles (ACF). Une valeur d’autocorrélation supérieure à l’intervalle de confiance de 95% illustrée par la ligne pointillée indique une possible dépendance entre la variable et la période de l’année (temps). Par exemple, une certaine valeur d’une variable observée lors d’une année précise pourrait être expliquée par un certain événement datant d’une année antérieure (décalage dans le temps en années). Il est à noter que l’autocorrélation au temps de décalage 0 est, par définition, égale à 1.

Plus bas se trouvent les résultats du test de la statistique de Ljung–Box appliqué sur chaque variable et confirment les résultats illustrés par les graphiques précédents. Une valeur de P (p-value) inférieure à 0.05 permet de supposer que les valeurs résiduelles d’une variable dépendent de la période de l’année (temps).

1.7 Notes sur les versions

Quoi de nouveau, mis à jour ou corrigé dans cette version


ACTION: Nouveau     ACTION: Mise à jour     ACTION: Corrigé


RCBA_vv_habitat.Rmd Version 1.1 — 1er novembre 2017

Cette version présente des suggestions d’actions en rapport avec la vérification et validation des données générales.

ACTION: Actions.

RCBA_vv_habitat.Rmd Version 1.0 — 18 août 2017

Version initiale de l’outil de vérification et validation des données d’habitat.

ACTION: Première version.


Développé par Martin Jean et Evelyne Paquette-Boisclair

LS0tDQpkYXRlOiAnMjAxNy0xMS0wMScNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQp2ZXJzaW9uOiAnMS4xJw0KLS0tDQoNCnwgIVtdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vZ2NfZnIucG5nKSAgfCAgIVtdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vcmNiYV9sb2dvLnBuZykgfA0KfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06fCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQojVsOJUklGSUNBVElPTiBFVCBWQUxJREFUSU9OIFJDQkEgLSBET05Ow4lFUyBEJ0hBQklUQVQNCg0KKkVudmlyb25uZW1lbnQgZXQgY2hhbmdlbWVudCBjbGltYXRpcXVlIENhbmFkYSoNCg0KKkFuYWx5c2UgcsOpYWxpc8OpZSBsZSBgciBTeXMudGltZSgpYCoNCg0KKioqDQoNCkNlIGRvY3VtZW50IGVzdCB1biBjYXJuZXQgZGUgbm90ZSDDqWNyaXQgZW4gW01hcmtkb3duIFJdKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pLiBMb3JzcXVlIHZvdXMgw6l4w6ljdXRlciBsZSBjb2RlIGludMOpZ3LDqSBhdSBjYXJuZXQsIGxlcyByw6lzdWxhdHMgYXBwYXJhaXRyb250IHNvdXMgbGUgY29kZSBjb3JyZXNwb25kYW50Lg0KDQpDZSByYXBwb3J0IHByw6lzZW50ZSBsZXMgcsOpc3VsdGF0cyBkZSBsYSB2w6lyaWZpY2F0aW9uIGV0IGxhIHZhbGlkYXRpb24gZGVzIGRvbm7DqWVzIGQnaGFiaXRhdCBwb3VyIGxlIHByb2pldCAqKmByIHBhc3RlKGRhdGFzZXROYW1lKWAqKi4NCg0KRGFucyBjZXR0ZSBhbmFseXNlLCBsZSBqZXUgZGUgZGVzY3JpcHRldXJzIGQnaGFiaXRhdCBzZXJhIHbDqXJpZmnDqSBwb3VyIHLDqXBvbmRyZSDDoCBsYSBxdWVzdGlvbiBzdWl2YW50ZSA6DQogIA0KICArIExlcyBkb25uw6llcyBkJ2hhYml0YXQgY29ycmVzcG9uZGVudC1lbGxlcyBiaWVuIMOgIGNlIHF1aSBhIMOpdMOpIG9ic2VydsOpIHN1ciBsZSB0ZXJyYWluID8NCg0KQ2UgZG9jdW1lbnQgZXN0IHVuIGNhcm5ldCBkZSBub3RlcyBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkuIFBvdXIgb2J0ZW5pciBsZXMgcsOpc3VsdGF0cyBkZSBsYSB2w6lyaWZpY2F0aW9uIGV0IGxhIHZhbGlkYXRpb24gZGVzIGRvbm7DqWVzLCBleMOpY3V0ZXogbGVzIGNvbW1hbmRlcyBjb250ZW51ZXMgZGFucyBjZSBjYXJuZXQgZGUgbm90ZXMuIFBvdXIgY2UgZmFpcmUsIHBvc2l0aW9ubmV6IHZvdHJlIGN1cnNldXIgw6AgbCdpbnTDqXJpZXVyIGQndW5lIGJvw650ZSBkZSBjb21tYW5kZXMgZXQgY2xpcXVleiBzdXIgbGEgZmzDqGNoZSB2ZXJ0ZSDDoCBsYSBkcm9pdGUgZGUgY2VsbGUtY2kgbm9tbcOpZSAqUnVuIEN1cnJlbnQgQ2h1bmsqIG91IGFwcHV5ZXogc3VyIGxlcyB0b3VjaGVzICpDdHJsK01haitFbnRyw6llKiAoKkNtZC1NYWorRW50csOpZSogc3VyICptYWNPUyopIGRlIHZvdHJlIGNsYXZpZXIuIFLDqXDDqXRleiBwb3VyIGNoYXF1ZSBib8OudGUgZGUgY29tbWFuZGVzLiDDgCBtZXN1cmUgcXVlIGxlcyBjb21tYW5kZXMgY29udGVudWVzIGRhbnMgY2UgY2FybmV0IHNlcm9udCBleMOpY3V0w6llcywgbGVzIHLDqXN1bHRhdHMgYXBwYXJhw650cm9udCBzb3VzIGNoYWN1bmUgZGVzIGNvbW1hbmRlcyBjb3JyZXNwb25kYW50ZXMgZGFucyBsYSBwcsOpc2VudGUgZmVuw6p0cmUuIFVuZSBmb2lzIHRvdXRlcyBsZXMgY29tbWFuZGVzIGV4w6ljdXTDqWVzLCBjbGlxdWV6IHN1ciBsZSBib3V0b24gKlByZXZpZXcqIGVuIGhhdXQgw6AgZ2F1Y2hlIGRlIGxhIHByw6lzZW50ZSBmZW7DqnRyZSBvdSBhcHB1eWVyIHN1ciBsZXMgdG91Y2hlcyAqQ3RybCtNYWorSyouIFVuZSBub3V2ZWxsZSBmZW7DqnRyZSBhcHBhcmHDrnRyYSBldCBjb250aWVuZHJhIGxlIHJhcHBvcnQgZGUgY2VzIHLDqXN1bHRhdHMgZGUgbGEgdsOpcmlmaWNhdGlvbiBldCBsYSB2YWxpZGF0aW9uIGRlcyBkb25uw6llcyBnw6luw6lyYWxlcyBSQ0JBLg0KDQojI1Byw6lyZXF1aXMNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIFJlcXVpcmVkIFBhY2thZ2VzIGFuZCBDdXN0b20gRnVuY3Rpb25zDQpzb3VyY2UoIi4uLy4uLy4uL1JlcXVpcmVkX3BhY2thZ2VzLlIiKQ0Kc291cmNlKCIuLi8uLi8uLi9SZXF1aXJlZF9mdW5jdGlvbnMuUiIpDQoNCg0KIyMgUHJvamVjdCBQcmVmZXJlbmNlcw0Kc291cmNlKCIuLi8uLi8uLi9Db25maWd1cmF0aW9uL3Byb2plY3Rfc2V0dGluZ3MuUiIpDQoNCmBgYA0KDQpDZSBjYXJuZXQgc3VwcG9zZSBxdWUgdm91cyBhdmV6IGltcG9ydMOpIHZvcyBkb25uw6llcyBkYW5zICpSKiBlbiB1dGlsaXNhbnQgbGUgY2FybmV0IGQnaW1wb3J0YXRpb24gZGUgZG9ubsOpZXMgKEFFRF9JbXBvcnRhdGlvbi5SbWQpLg0KDQpMZSBmaWNoaWVyIGNvbnRlbmFudCBsZXMgZG9ubmXDqXMgZCdoYWJpdGF0IGRlIGNlIHByb2pldCBlc3QgKipgciBpZihpcy5kYXRhLmZyYW1lKGRhdGFzZXQuRU5WKSkgInByw6lzZW50IiBlbHNlICJhYnNlbnQuIFZldWlsbGV6IG91dnJpciBldCBleMOpY3V0ZXIgbGUgY2FybmV0ICdSQ0JBX3Z2X2ltcG9ydGF0aW9uLlJtZCcgYXZhbnQgZCdleMOpY3V0ZXIgbGUgcHLDqXNlbnQgY2FybmV0ImAqKi4NCg0KIyNTdGF0aXN0aXF1ZXMgZGVzY3JpcHRpdmVzDQoNCkxlIGZpY2hpZXIgZGUgZG9ubsOpZXMgY29udGllbnQgYHIgbnJvdyhkYXRhc2V0LkVOVikgYCB2aXNpdGVzIChsaWduZXMpIGV0IGByIG5jb2woZGF0YXNldC5FTlYpIGAgdGF4b25zIChjb2xvbm5lcykuDQoNCkxlIHRhYmxlYXUgc3VpdmFudCBwcsOpc2VudGUgdW5lIHBhcnRpZSBkZXMgZG9ubsOpZXMgZHUgZmljaGllci4NCg0KKipMZWN0dXJlIGRlcyBkb25uw6llcyBkJ2hhYml0YXQqKg0KDQpgciBoZWFkKGRhdGFzZXQuRU5WKSBgDQoNCj4gIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2FjdGlvbi5wbmcpDQo+ICpWw6lyaWZpZXogbGVzIGRvbm7DqWVzIGV0IGFzc3VyZXotdm91cyBxdWUgY2VsYSByw6lmbMOodGUgYmllbiBsYSByw6lhbGl0w6kuIEV4YW1pbmV6IHBhcnRpY3VsacOocmVtZW50IGxlcyDDqWzDqW1lbnRzIHN1aXZhbnRzOioNCj4NCj4gLSAqTGUgZmljaGllciBzZW1ibGUtdCdpbCBhdm9pciDDqXTDqSBsdSBjb3JyZWN0ZW1lbnQ/Kg0KPiAtICpEZXMgY29sb25uZXMgc29udC1lbGxlcyBtYW5xdWFudGVzPyoNCg0KKipMaXN0ZSBkZXMgdmlzaXRlcyBwcsOpc2VudGVzIGRhbnMgbGVzIGRvbm7DqWVzIGQnaGFiaXRhdCAoSUQgcHJvdmVuYW50IGRlIGxhIGJhc2UgZGUgZG9ubsOpZXMgUkNCQSkgOioqICANCg0KYHIgcm93bmFtZXMoZGF0YXNldC5FTlYpIGANCg0KPiAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vYWN0aW9uLnBuZykNCj4gKlbDqXJpZmlleiBsZXMgZG9ubsOpZXMgZXQgYXNzdXJlei12b3VzIHF1ZSBjZWxhIHLDqWZsw6h0ZSBiaWVuIGxhIHLDqWFsaXTDqS4gQ29tcGFyZXogbGEgbGlzdGUgY2ktaGF1dCBhdmVjIGxlIHRhYmxlYXUgc3VpdmFudCBxdWkgcHLDqXNlbnRlIGxlcyB2aXNpdGVzIHByw6lzZW50ZXMgZGFucyBsJ3VuIG91IGwnYXV0cmUgZGVzIGZpY2hpZXJzIGRlIGRvbm7DqWVzIHBvdXIgdm91cyBhc3N1cmV6IHF1ZSB0b3V0IGVzdCBhZMOpcXVhdC4NCg0KDQpgciBmb3JtYXR0YWJsZShkYXRhc2V0Lk5BTSwgYWxpZ24gPSAiYyIsIHJvdy5uYW1lcyA9IFRSVUUpYA0KDQoqKkxpc3RlIGRlcyB2YXJpYWJsZXMgOioqICANCg0KYHIgY29sbmFtZXMoZGF0YXNldC5FTlYpIGANCg0KPiAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vYWN0aW9uLnBuZykNCj4gKlbDqXJpZmlleiBsZXMgdmFyaWFibGVzIGNpLWhhdXQgZXQgYXNzdXJlei12b3VzIHF1J2VsbGVzIHNvbnQgdG91dGVzIHByw6lzZW50ZXMuDQoNCg0KIyMjU3RhdGlzdGlxdWVzIGfDqW7DqXJhbGVzDQoNCkxlIHRhYmxlYXUgc3VpdmFudCBwcsOpc2VudGUgbGVzIHN0YXRpc3RpcXVlcyBnw6luw6lyYWxlcyBwYXIgdmFyaWFibGUuIExvcnNxdWUgbGUgcsOpc3VsdGF0IG9idGVudSDDoCBsYSBsaWduZSAqQmluYXJ5RGF0YSogZHUgdGFibGVhdSBlc3QgKlRSVUUqLCBjZWxhIGluZGlxdWUgcXVlIGxhIHZhcmlhYmxlIHByw6lzZW50ZSBkZXMgZG9ubsOpZXMgYmluYWlyZXMuIENlcGVuZGFudCwgY2UgcsOpc3VsdGF0IHBldXQgw6lnYWxlbWVudCBuJ8OqdHJlIG9idGVudSBxdWUgcGFyY2UgcXVlIGxhIHZhcmlhYmxlIG5lIHByw6lzZW50ZSBxdSd1bmUgw6AgZGV1eCBkb25uw6llcyBhdSBtYXhpbXVtLiBMYSBsaWduZSAqTmEudmFsdWVzKiBpbmRpcXVlIGxlIG5vbWJyZSBkZSB2YWxldXJzIG1hbnF1YW50ZXMgcXVlIHByw6lzZW50ZSBjaGFxdWUgdmFyaWFibGUuDQoNCioqVGFibGVhdSBkZXMgc3RhdGlzdGlxdWVzIGfDqW7DqXJhbGVzKioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiNUYWJsZWF1IGRlcyBwYXJhbcOodHJlcyBnw6luw6lyYXV4IHBhciB2YXJpYWJsZQ0KDQp7c3VtbWFyeS5FTlYgPC0gYXMuZGF0YS5mcmFtZSh0KGRvLmNhbGwoY2JpbmQsIGxhcHBseShkYXRhc2V0LkVOViwgc3VtbWFyeSkpKSkNCnN1bW1hcnkuRU5WJFN0ZC5kZXZpYXRpb24gPC0gYXBwbHkoZGF0YXNldC5FTlYsIDIsIHNkLCBuYS5ybSA9IFQpDQpzdW1tYXJ5LkVOViRMZW5ndGggPC0gY29sU3VtcyghaXMubmEoZGF0YXNldC5FTlYpKQ0Kc3VtbWFyeS5FTlYkQmluYXJ5RGF0YSA8LSBzYXBwbHkoZGF0YXNldC5FTlYsZnVuY3Rpb24oeClsZW5ndGgodW5pcXVlKG5hLm9taXQoeCkpKTw9MikNCnN1bW1hcnkuRU5WJE5BLnZhbHVlcyA8LSBjb2xTdW1zKGlzLm5hKGRhdGFzZXQuRU5WKSkNCnN1bW1hcnkuRU5WJGBOQSdzYCA8LSBOVUxMDQpzdW1tYXJ5LkVOViA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeS5FTlYpKQ0Kc3VtbWFyeS5FTlYNCn0NCmZvcm1hdHRhYmxlKHN1bW1hcnkuRU5WLCBkaWdpdHMgPSAyLCBhbGlnbiA9ICJjIikNCg0KYGBgDQoNCj4gIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2FjdGlvbi5wbmcpDQo+ICpWw6lyaWZpZXogbGVzIGRvbm7DqWVzIGV0IGFzc3VyZXotdm91cyBxdSdlbGxlcyByw6lmbMOodGVudCBiaWVuIGxhIHLDqWFsaXTDqS4gRXhhbWluZXogbGVzIHN0YXRpc3RpcXVlcyBkZSBiYXNlIGV0IGlkZW50aWZpZXosIGxlIGNhcyDDqWNow6lhbnQsIGRlcyBhbm9tYWxpZXMgYXUgbml2ZWF1eCBkZXMgc3RhdGlzdGlxdWVzIGRlIGJhc2UuDQoNCiMjTG9jYWxpc2F0aW9uIGRlcyBkb25uw6llcyBlbnZpcm9ubmVtZW50YWxlcw0KDQojIyNEaXN0cmlidXRpb24gZ8Opb2dyYXBoaXF1ZSBkZXMgdmFyaWFibGVzIGQnaGFiaXRhdA0KDQpMZXMgZ3JhcGhpcXVlcyBzdWl2YW50cyBpbGx1c3RyZW50IGxhIHBvc2l0aW9uIChsYXRpdHVkZSBldCBsb25naXR1ZGUpIGFpbnNpIHF1ZSBsYSB2YWxldXIgb2JzZXJ2w6llIGRlcyB2YXJpYWJsZXMgZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzIGQnaGFiaXRhdC4NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojRGlzdHJpYnV0aW9uIGfDqW9ncmFwaGlxdWUgZGVzIHZhbGV1cnMgZGVzIHZhcmlhYmxlcyBkJ2hhYml0YXQNCg0KZGF0YXNldC5FTlYyIDwtIHJvd25hbWVzX3RvX2NvbHVtbihkYXRhc2V0LkVOViwgdmFyID0gInJvd25hbWVzIikNCmRhdGFzZXQuR0VOMiA8LSByb3duYW1lc190b19jb2x1bW4oZGF0YXNldC5HRU4sIHZhciA9ICJyb3duYW1lcyIpDQpkYXRhc2V0LkVOVjIgPC0gbGVmdF9qb2luKGRhdGFzZXQuRU5WMiwgZGF0YXNldC5HRU4yWyxjKCJyb3duYW1lcyIsICJMb25naXR1ZGUiLCAiTGF0aXR1ZGUiKV0sIGJ5ID0gInJvd25hbWVzIikNCg0Kc2l6ZSA8LSBkYXRhc2V0LkVOVjJbMjpuY29sKGRhdGFzZXQuRU5WMildDQpzaXplW2MobGVuZ3RoKHNpemUpLTIsbGVuZ3RoKHNpemUpLTEsIGxlbmd0aChzaXplKSldIDwtIE5BDQoNCmZvcihpIGluIDI6KG5jb2woZGF0YXNldC5FTlYyKS0zKSl7DQpncmFwaC5nZW8uYWIgPC0gZ2dwbG90KGRhdGFzZXQuRU5WMiwgYWVzKExvbmdpdHVkZSwgTGF0aXR1ZGUpKSArDQogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgYWVzKHNpemUgPSBzaXplW2ktMV0pKSArDQogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbiBnw6lvZ3JhcGhpcXVlIGRlIGxhIHZhcmlhYmxlXG4iLCBjb2xuYW1lcyhkYXRhc2V0LkVOVjJbaV0pKSkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygxLDEwKSwgbmFtZSA9ICJWYWxldXIiKQ0KZ3JhcGguZ2VvLmFiDQpwcmludChncmFwaC5nZW8uYWIpDQp9DQoNCiNybShzaXplKQ0KI3JtKGRhdGFzZXQuR0VOMikNCmBgYA0KDQoNCiMjI0NhcnRvZ3JhcGhpZSBkZSBsYSBkaXN0cmlidXRpb24gZGUgbCdhbHRpdHVkZSBwYXIgc2l0ZQ0KDQpMYSBjYXJ0ZSBpbnRlcmFjdGl2ZSBzdWl2YW50ZSBpbGx1c3RyZSBsYSBwb3NpdGlvbiBkZXMgc2l0ZXMgZW4gZm9uY3Rpb24gZGVzIGNvb3Jkb25uw6llcyBnw6lvZ3JhcGhpcXVlcyBjb250ZW51ZXMgZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzIGFpbnNpIHF1ZSBsJ2FsdGl0dWRlIHBhciBzaXRlLiBDbGlxdWV6IHN1ciBsZSBtYXJxdWV1ciBkJ3VuZSB2aXNpdGUgcG91ciBpbmRpcXVlciBsJ2FsdGl0dWRlIG9ic2VydsOpZSBkYW5zIGNlbGxlLWNpLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LjUsIGZpZy53aWR0aD04LjUsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCiNDYXJ0b2dyYXBoaWUgZGUgbGEgZGlzdHJpYnV0aW9uIGRlIGwnYWx0aXR1ZGUgcGFyIHNpdGUNCg0KZGF0YXNldC5TUEEyIDwtIHJvd25hbWVzX3RvX2NvbHVtbihkYXRhc2V0LlNQQSwgdmFyID0gInJvd25hbWVzIikNCmRhdGFzZXQuTkFNMiA8LSByb3duYW1lc190b19jb2x1bW4oZGF0YXNldC5OQU0sIHZhciA9ICJyb3duYW1lcyIpDQpkYXRhc2V0LlNQQTIgPC0gbGVmdF9qb2luKGRhdGFzZXQuU1BBMiwgZGF0YXNldC5OQU0yWywgYygicm93bmFtZXMiLCAiU2l0ZSIsICJTYW1wbGVEYXRlIiwgIlNhbXBsZU51bWJlciIpXSwgYnkgPSAicm93bmFtZXMiKQ0KZGF0YXNldC5TUEEyJFNpdGVfRGF0ZV9OdW1iZXIgPC0gcGFzdGUoZGF0YXNldC5TUEEyJFNpdGUsICJfIiwgZGF0YXNldC5TUEEyJFNhbXBsZURhdGUsICJfIiwgZGF0YXNldC5TUEEyJFNhbXBsZU51bWJlcikNCmRhdGVzIDwtIGFzLkRhdGUoZGF0YXNldC5TUEEyJFNhbXBsZURhdGUsICIlWS0lbS0lZCIpDQpkYXRhc2V0LlNQQTIkWWVhciA8LSBzdHJmdGltZShwYXJzZV9kYXRlX3RpbWUoYXMuY2hhcmFjdGVyKGRhdGVzKSwgIiVZLSVtLSVkIiksICIleSIpDQpkYXRhc2V0LlNQQTIkU2l0ZV9ZZWFyIDwtIHBhc3RlKGRhdGFzZXQuU1BBMiRTaXRlLCAiXyIsIGRhdGFzZXQuU1BBMiRZZWFyKQ0KDQpjYWJpblBvaW50cyA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKGNvb3JkcyA9IGRhdGFzZXQuU1BBWywgMToyXSwgZGF0YSA9IGRhdGFzZXQuU1BBKQ0KICANCmdldENvbG9yMiA8LSBmdW5jdGlvbihkYXRhc2V0LlNQQTIpIHsNCiAgc2FwcGx5KGRhdGFzZXQuU1BBMiRTYW1wbGVEYXRlLCBmdW5jdGlvbihTYW1wbGVEYXRlKSB7DQogIGlmKFNhbXBsZURhdGUgPD0gIjIwMDUtMTItMzEiKSB7DQogICAgImdyZWVuIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAwNi0xMi0zMSIpIHsNCiAgICAieWVsbG93Ig0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAwNy0xMi0zMSIpIHsNCiAgICAiZGFya29yYW5nZSINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMDgtMTItMzEiKSB7DQogICAgInJlZCINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMDktMTItMzEiKSB7DQogICAgInBpbmsiDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDEwLTEyLTMxIikgew0KICAgICJibHVlIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxMS0xMi0zMSIpIHsNCiAgICAiZGFya2dyZWVuIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxMi0xMi0zMSIpIHsNCiAgICAiY3lhbiINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTMtMTItMzEiKSB7DQogICAgImRlZXBwaW5rIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxNC0xMi0zMSIpIHsNCiAgICAibGlnaHRibHVlIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxNS0xMi0zMSIpIHsNCiAgICAibGlnaHRzZWFncmVlbiINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTYtMTItMzEiKSB7DQogICAgImRhcmt2aW9sZXQiDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDE3LTEyLTMxIikgew0KICAgICJkYXJrcmVkIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxOC0xMi0zMSIpIHsNCiAgICAiY2FkZXRibHVlIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxOS0xMi0zMSIpIHsNCiAgICAiYmxhY2siDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDIwLTEyLTMxIikgew0KICAgICJncmF5Ig0KICB9IGVsc2Ugew0KICAgICJicm93biINCiAgfSB9KQ0KfSANCg0KI2RhdGVzIDwtIGFzLkRhdGUoZGF0YXNldC5TUEEyJFNhbXBsZURhdGUsICIlWS0lbS0lZCIpIA0KI2RhdGFzZXQuU1BBMiRZZWFyIDwtIHN0cmZ0aW1lKHBhcnNlX2RhdGVfdGltZShhcy5jaGFyYWN0ZXIoZGF0ZXMpLCAiJVktJW0tJWQiKSwgIiVZIikNCg0KICBsZWFmbGV0KGRhdGEgPSBkYXRhc2V0LlNQQTIpICU+JSBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRFc3JpLldvcmxkVG9wb01hcCkgJT4lIGFkZENpcmNsZU1hcmtlcnMofkxvbmdpdHVkZSwgfkxhdGl0dWRlLCBwb3B1cCA9IHBhc3RlKCAiU3RhdGlvbl9Bbm7DqWUgOiAiLCBkYXRhc2V0LlNQQTIkU2l0ZV9ZZWFyLCAiPGJyPiIsICJBbHRpdHVkZSA6ICIsIGRhdGFzZXQuRU5WMiRBbHRpdHVkZSwgIjxicj4iKSwgbGFiZWwgPSAoZGF0YXNldC5TUEEyJFNpdGVfWWVhciksIHJhZGl1cyA9IGRhdGFzZXQuRU5WMiRBbHRpdHVkZSwgY29sb3IgPSBnZXRDb2xvcjIoZGF0YXNldC5TUEEyKSwgc3Ryb2tlID0gRiwgZmlsbE9wYWNpdHkgPSAwLjUsIGNsdXN0ZXJPcHRpb25zID0gbWFya2VyQ2x1c3Rlck9wdGlvbnMoKSkgJT4lIGFkZExlZ2VuZCgNCiAgcG9zaXRpb24gPSAnYm90dG9tcmlnaHQnLA0KICBjb2xvcnMgPSBwYWxldHRlKCksDQogIGxhYmVscyA9IHBhbGV0dGUoKSwNCiAgb3BhY2l0eSA9IDEsDQogIHRpdGxlID0gJ0zDqWdlbmRlJykNCiAgDQpybShkYXRhc2V0LlNQQTIpDQoNCmBgYA0KDQoNCiMjUHLDqXNlbmNlIGRlIGRvbm7DqWVzIGFiZXJyYW50ZXMNCg0KIyMjRGlzcGVyc2lvbiBkZXMgdmFsZXVycyBvYnNlcnbDqWVzDQoNCkxlcyBkaWFncmFtbWVzIGRlIGRpc3BlcnNpb24gc3VpdmFudHMgcHLDqXNlbnRlbnQgbGEgdmFsZXVyIGRlcyBkb25uw6llcyBkZSB2YXJpYWJsZXMgY29udGludWVzIG9ic2VydsOpZXMgZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzIGRhbnMgbCdvcmRyZSDDoCBsYXF1ZWxsZSBlbGxlcyBhcHBhcmFpc3NlbnQgZGFucyBjZSBmaWNoaWVyIHBvdXIgY2hhcXVlIHZhcmlhYmxlLiBTb3VzIGwnYXhlIGRlcyBYIHNlIHRyb3V2ZSBsJ2lkZW50aWZpYW50IGRlIGxhIHZpc2l0ZSB2aXMtw6AtdmlzIGxhIHZhbGV1ciBvYnNlcnbDqWUgY29ycmVzcG9uZGFudGUsIHNvaXQgbGUgbm9tIGR1IHNpdGUgZCdvw7kgcHJvdmllbnQgbGEgZG9ubsOpZSwgc2EgZGF0ZSBkJ8OpY2hhbnRpbGxvbm5hZ2UgZXQgbGUgbm9tYnJlIGQnw6ljaGFudGlsbG9ubmFnZSBwcmlzIHBvdXIgY2V0dGUgZG9ubsOpZS4NCg0KPiAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vYWN0aW9uLnBuZykNCj4gKlbDqXJpZmllciBsZXMgZG9ubsOpZXMgZXQgYXNzdXJlei12b3VzIHF1J2VsbGVzIHLDqWZsw6h0ZW50IGJpZW4gbGEgcsOpYWxpdMOpLiBFeGFtaW5leiBsZXMgcG9pbnRzIHN1aXZhbnRzIDoqDQo+DQo+IC0gKkRlcyBkb25uw6llcyBzb3J0ZW50LWVsbGVzIGRlIGwnb3JkaW5haXJlPyoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNEaWFncmFtbWVzIGRlIGRpc3BlcnNpb24gZGVzIHZhbGV1cnMgb2JzZXJ2w6llcyBwYXIgdmFyaWFibGUgZCdoYWJpdGF0DQoNCmRhdGFzZXQuTkFNMiRTaXRlX0RhdGVfTnVtYmVyIDwtIHBhc3RlKGRhdGFzZXQuTkFNMiRTaXRlLCAiXyIsIGRhdGFzZXQuTkFNMiRTYW1wbGVEYXRlLCAiXyIsIGRhdGFzZXQuTkFNMiRTYW1wbGVOdW1iZXIpDQpkYXRhc2V0LkVOVjIgPC0gbGVmdF9qb2luKGRhdGFzZXQuRU5WMiwgZGF0YXNldC5OQU0yWyxjKCJyb3duYW1lcyIsICJTaXRlX0RhdGVfTnVtYmVyIildLCBieSA9ICJyb3duYW1lcyIpDQoNCmZvcihqIGluIDI6KG5jb2woZGF0YXNldC5FTlYyKS0zKSl7DQpwbG90LmFiIDwtIGdncGxvdChkYXRhc2V0LkVOVjIsIGFlcyh4ID0gZGF0YXNldC5FTlYyJFNpdGVfRGF0ZV9OdW1iZXIsIHkgPSBkYXRhc2V0LkVOVjJbLGpdKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHkgPSAiVmFsZXVyIiwgeCA9ICJWaXNpdGUiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gLTAuMDUpKSArDQogICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGlmZWxzZSghaXMubmEoZGF0YXNldC5FTlYyWyxqXSksIGRhdGFzZXQuRU5WMiRTaXRlX0RhdGVfTnVtYmVyLCAiIiksIGxhYmVscyA9IGlmZWxzZSghaXMubmEoZGF0YXNldC5FTlYyWyxqXSksIGRhdGFzZXQuRU5WMiRTaXRlX0RhdGVfTnVtYmVyLCAiIiksIG5hLnZhbHVlID0gTkEpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZShwYXN0ZSgiVmFsZXVycyBvYnNlcnbDqWVzIGRlIGxhIHZhcmlhYmxlIiwgY29sbmFtZXMoZGF0YXNldC5FTlYyW2pdKSwgInBhciB2aXNpdGUiKSkNCnBsb3QuYWINCnByaW50KHBsb3QuYWIpDQp9DQoNCmBgYA0KDQojIyNCb8OudGVzIMOgIG1vdXN0YWNoZXMgZGVzIHZhbGV1cnMgb2JzZXJ2w6llcyBldCB0cmFuc2Zvcm3DqWVzDQoNCkxhIHByZW1pw6hyZSBib8OudGUgw6AgbW91c3RhY2hlcyAow6AgZ2F1Y2hlKSBwcsOpc2VudGVudCBsYSBkaXN0cmlidXRpb24gZGVzIHZhbGV1cnMgZGUgdmFyaWFibGVzIGNvbnRpbnVlcyBvYnNlcnbDqWVzIGRhbnMgbGUgZmljaGllciBkZSBkb25uw6llcyBldCBsYSBkZXV4acOobWUgYm/DrnRlIMOgIG1vdXN0YWNoZXMgKMOgIGRyb2l0ZSkgcHLDqXNlbnRlbnQgbGEgZGlzdHJpYnV0aW9uIGRlcyB2YWxldXJzIGRlIHZhcmlhYmxlcyBjb250aW51ZXMgb2JzZXJ2w6llcyBheWFudCBzdWJpZXMgdW5lIHRyYW5zZm9ybWF0aW9uIGxvZ2FyaXRobWlxdWUuIA0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqVsOpcmlmaWV6IGxlcyBkb25uw6llcyBldCBhc3N1cmV6LXZvdXMgcXVlIGNlbGEgcsOpZmzDqHRlIGJpZW4gbGEgcsOpYWxpdMOpLiBFeGFtaW5leiBwYXJ0aWN1bGnDqHJlbWVudCBsZXMgw6lsw6ltZW50cyBzdWl2YW50czoqDQo+DQo+IC0gKkRlcyBkb25uw6llcyBzZW1ibGVudC1lbGxlcyBzb3J0aXIgZGUgbCdvcmRpbmFpcmU/Kg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCb8OudGVzIMOgIG1vdXN0YWNoZXMgZGVzIHZhbGV1cnMgb2JzZXJ2w6llcyBldCB0cmFuc2Zvcm3DqWVzDQoNCmZvcihpIGluIDI6KG5jb2woZGF0YXNldC5FTlYyKS0zKSl7DQpib3guYWIuMSA8LSBxcGxvdCh5ID0gZGF0YXNldC5FTlYyWyxpXSwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gY29sbmFtZXMoZGF0YXNldC5FTlYyW2ldKSkgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZShwYXN0ZSgiRGlzdHJpYnV0aW9uIGRlcyB2YWxldXJzIG9ic2VydsOpZXNcbnBvdXIiLCBjb2xuYW1lcyhkYXRhc2V0LkVOVjJbaV0pKSkNCmJveC5hYi4yIDwtIHFwbG90KHkgPSBkYXRhc2V0LkVOVjJbLGldLCB4ID0gIiIsIGdlb20gPSAiYm94cGxvdCIsIHlsYWIgPSBwYXN0ZSgiTG9nKCIsIGNvbG5hbWVzKGRhdGFzZXQuRU5WMltpXSksIikiKSwgbG9nID0gInkiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb24gZGUgbG9nKHZhbGV1cnMgb2JzZXJ2w6llcylcbnBvdXIiLCBjb2xuYW1lcyhkYXRhc2V0LkVOVjJbaV0pKSkNCg0KZ3JpZC5hcnJhbmdlKGJveC5hYi4xLCBib3guYWIuMiwgbmNvbCA9IDIpDQp9DQoNCmBgYA0KDQoNCg0KIyMjSWRlbnRpZmljYXRpb24gZGVzIGRvbm7DqWVzIGFiZXJyYW50ZXMgcG90ZW50aWVsbGVzDQoNCkxhIHByZW1pw6hyZSBib8OudGUgw6AgbW91c3RhY2hlcyAow6AgZ2F1Y2hlKSBwcsOpc2VudGVudCBsYSBkaXN0cmlidXRpb24gZGVzIHZhbGV1cnMgZGUgdmFyaWFibGVzIGNvbnRpbnVlcyBvYnNlcnbDqWVzIGRhbnMgbGUgZmljaGllciBkZSBkb25uw6llcyBldCBsZSBkaWFncmFtbWUgZGUgZGlzcGVyc2lvbiAow6AgZHJvaXRlKSBwcsOpc2VudGVudCBsYSBkaXN0cmlidXRpb24gZGVzIHZhbGV1cnMgZGUgdmFyaWFibGVzIGNvbnRpbnVlcyBvYnNlcnbDqWVzIGRhbnMgbCdvcmRyZSDDoCBsYXF1ZWxsZSBlbGxlcyBhcHBhcmFpc3NlbnQgZGFucyBjZSBmaWNoaWVyLiBMZXMgZG9ubsOpZXMgcHLDqXNlbnRhbnQgdW5lIGlkZW50aWZpY2F0aW9uIHBhciBsZXVyIGlkZW50aWZpYW50IHN1ciBsZXMgZGlhZ3JhbW1lcyByZXByw6lzZW50ZW50IGxlcyBkb25uw6llcyBwb3RlbnRpZWxsZW1lbnQgYWJlcnJhbnRlcyBjb250ZW51ZXMgZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzLiBMYSBtw6l0aG9kZSB1dGlsaXPDqWUgcG91ciBpZGVudGlmaWVyIGxlcyBkb25uw6llcyBwb3RlbnRpZWxsZW1lbnQgYWJlcnJhbnRlcyBlc3QgbCfDqXRlbmR1ZSBpbnRlcnF1YW50aWxlICgqSW50ZXJxdWFudGlsZSByYW5nZSogb3UgKklRUiopLiBMJ0lRUiBzZSBjYWxjdWxlIGRlIGxhIG1hbmnDqHJlIHN1aXZhbnRlIDoNCg0KYElRUih4KSA9IHF1YW50aWxlKHgsIDMvNCkgLSBxdWFudGlsZSh4LCAxLzQpYA0KDQoNCkxlcyB2YWxldXJzIHBvdGVudGllbGxlbWVudCBhYmVycmFudGVzIHNvbnQgZMOpZmluaWVzIGNvbW1lIGRlcyBvYnNlcnZhdGlvbnMgcXVpIHNlIHNpdHVlbnQgYXUtZGVzc291cyBkZSAqUTEgLSAxLDUgSVFSKiBvdSBwbHVzIGRlICpRMyArIDEsNSBJUVIqLg0KDQpMJ2lkZW50aWZpYW50IGRlIGxhIHZpc2l0ZSBjb3JyZXNwb25kIGF1IG5vbSBkdSBzaXRlIGQnb8O5IHByb3ZpZW50IGxhIGRvbm7DqWUsIHNhIGRhdGUgZCfDqWNoYW50aWxsb25uYWdlIGV0IGxlIG5vbWJyZSBkJ8OpY2hhbnRpbGxvbm5hZ2UgcHJpcyBwb3VyIGNldHRlIGRvbm7DqWUuDQoNCj4gIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2FjdGlvbi5wbmcpDQo+ICpFeGFtaW5leiBsZXMgZ3JhcGhpcXVlcyBzdWl2YW50cyBldCBwb3J0ZXogdm90cmUgYXR0ZW50aW9uIHN1ciBsZXMgcG9pbnRzIChzaSBwcsOpc2VudHMpIGF1eHF1ZWxzIHVuIGlkZW50aWZpYW50IGVzdCBhc3NvY2nDqS4gUG9zZXotdm91cyBsYSBxdWVzdGlvbiBzdWl2YW50ZSA6Kg0KPg0KPiAtICpMZXMgZG9ubsOpZXMgcG90ZW50aWVsbGVtZW50IGFiZXJyYW50ZXMgbGUgc29udC1lbGxlcyB2cmFpbWVudD8qDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojSWRlbnRpZmljYXRpb24gZGVzIGRvbm7DqWVzIGFiZXJyYW50ZXMgcG90ZW50aWVsbGVzDQoNCmZvciAoaiBpbiAyOihuY29sKGRhdGFzZXQuRU5WMiktMykpIHsNCiAgYm94cGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGRhdGFzZXQuRU5WMiwgYWVzKHggPSAiIiwgeSA9IGRhdGFzZXQuRU5WMlssal0pKSArDQogICAgZ2VvbV9ib3hwbG90KCkgKw0KICAgIHlsYWIoIlZhbGV1ciIpICsNCiAgICB4bGFiKCIiKSArDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgICBnZ3RpdGxlKHBhc3RlKCJWYWxldXJzIG9ic2VydsOpZXMgZGUgbGFcbnZhcmlhYmxlIiwgY29sbmFtZXMoZGF0YXNldC5FTlYyW2pdKSkpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gaWZlbHNlKGRhdGFzZXQuRU5WMlssal0gPCBxdWFudGlsZShkYXRhc2V0LkVOVjJbLGpdLCBwcm9icz1jKC4yNSksIG5hLnJtID0gVCkgLSAxLjUqSVFSKGRhdGFzZXQuRU5WMlssal0sIG5hLnJtID0gVCl8ZGF0YXNldC5FTlYyWyxqXSA+IHF1YW50aWxlKGRhdGFzZXQuRU5WMlssal0sIHByb2JzPWMoLjc1KSwgbmEucm0gPSBUKSArIDEuNSpJUVIoZGF0YXNldC5FTlYyWyxqXSwgbmEucm0gPSBUKSwgZGF0YXNldC5FTlYyJFNpdGVfRGF0ZV9OdW1iZXIsICIiKSksIGhqdXN0ID0gLTAuMDUsIHNpemUgPSAzKQ0KDQogIGRvdGNoYXJ0IDwtIGdncGxvdChkYXRhID0gZGF0YXNldC5FTlYyLCBhZXMoeSA9IHNlcShkYXRhc2V0LkVOVjJbLGpdKSwgeCA9IGRhdGFzZXQuRU5WMlssal0sIG5hLnJtID0gVCkpICsNCiAgICBnZW9tX3BvaW50KG5hLnJtID0gVCkgKw0KICAgIHlsYWIoIk9yZHJlIGRlcyBkb25uw6llcyIpICsNCiAgICB4bGFiKCJWYWxldXIiKSArDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb24gZGVzIHZhbGV1cnNcbm9ic2VydsOpZXMgZGUgbGEgdmFyaWFibGVcbiIsIGNvbG5hbWVzKGRhdGFzZXQuRU5WMltqXSkpKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGlmZWxzZShkYXRhc2V0LkVOVjJbLGpdIDwgcXVhbnRpbGUoZGF0YXNldC5FTlYyWyxqXSwgcHJvYnM9YyguMjUpLCBuYS5ybSA9IFQpIC0gMS41KklRUihkYXRhc2V0LkVOVjJbLGpdLCBuYS5ybSA9IFQpfGRhdGFzZXQuRU5WMlssal0gPiBxdWFudGlsZShkYXRhc2V0LkVOVjJbLGpdLCBwcm9icz1jKC43NSksIG5hLnJtID0gVCkgKyAxLjUqSVFSKGRhdGFzZXQuRU5WMlssal0sIG5hLnJtID0gVCksIGRhdGFzZXQuRU5WMiRTaXRlX0RhdGVfTnVtYmVyLCAiIikpLCBoanVzdCA9IC0wLjA1LCBudWRnZV95ID0gMiwgc2l6ZSA9IDMpDQogICAgICAgIA0KICBncmlkLmFycmFuZ2UoYm94cGxvdCwgZG90Y2hhcnQsIG5jb2wgPSAyKQ0KfQ0KYGBgDQoNCkxhIGxpc3RlIHN1aXZhbnRlIHByw6lzZW50ZSBsZXMgZG9ubsOpZXMgcG90ZW50aWVsbGVtZW50IGFiZXJyYW50ZXMgY29udGVudWVzIGRhbnMgbGUgZmljaGllciBkZSBkb25uw6llcyBwb3VyIGNoYXF1ZSB2YXJpYWJsZS4gTG9yc3F1ZSBsJ2lkZW50aWZpYW50IGQndW5lIGRvbm7DqWUgeSBlc3QgaW5kaXF1w6ksIGNlbGEgaW5kaXF1ZSBxdWUgY2V0dGUgZG9ubsOpZSByZXByw6lzZW50ZSB1bmUgZG9ubsOpZSBwb3RlbnRpZWxsZW1lbnQgYWJlcnJhbnRlIGNvbnRlbnVlIGRhbnMgbGUgZmljaGllciBkZSBkb25uw6llcy4gTGVzIG1lbnRpb25zICoiIiogaW5kaXF1ZW50IGxlcyBkb25uw6llcyBub24gYWJlcnJhbnRlcyBldCBsZXMgbWVudGlvbnMgKk5BKiBpbmRpcXVlbnQgbGEgcHLDqXNlbmNlIGRlIHZhbGV1cnMgbWFucXVhbnRlcy4gTCdpZGVudGlmaWFudCBkZSBsYSB2aXNpdGUgY29ycmVzcG9uZCBhdSBub20gZHUgc2l0ZSBkJ2/DuSBwcm92aWVudCBsYSBkb25uw6llLCBzYSBkYXRlIGQnw6ljaGFudGlsbG9ubmFnZSBldCBsZSBub21icmUgZCfDqWNoYW50aWxsb25uYWdlIHByaXMgcG91ciBjZXR0ZSBkb25uw6llLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNJZGVudGlmaWNhdGlvbiBkZXMgZG9ubsOpZXMgYWJlcnJhbnRlcyBwb3RlbnRpZWxsZXMgKHN1aXRlKQ0KDQpmb3IgKGogaW4gMjoobmNvbChkYXRhc2V0LkVOVjIpLTMpKSB7DQpwcmludChjb2xuYW1lcyhkYXRhc2V0LkVOVjJbal0pKQ0KbGlzdCA8LSBsaXN0KGlmZWxzZShkYXRhc2V0LkVOVjJbLGpdIDwgcXVhbnRpbGUoZGF0YXNldC5FTlYyWyxqXSwgcHJvYnM9YyguMjUpLCBuYS5ybSA9IFQpIC0gMS41KklRUihkYXRhc2V0LkVOVjJbLGpdLCBuYS5ybSA9IFQpIHwgZGF0YXNldC5FTlYyWyxqXSA+IHF1YW50aWxlKGRhdGFzZXQuRU5WMlssal0sIHByb2JzPWMoLjc1KSwgbmEucm0gPSBUKSArIDEuNSpJUVIoZGF0YXNldC5FTlYyWyxqXSwgbmEucm0gPSBUKSwgZGF0YXNldC5FTlYyJFNpdGVfRGF0ZV9OdW1iZXIsICIiKSkNCnByaW50KGxpc3QpDQp9DQoNCmBgYA0KDQoNCiMjTm9ybWFsaXTDqSBkZXMgZG9ubsOpZXMgDQoNCiMjI0RpYWdyYW1tZXMgUXVhbnRpbGUtUXVhbnRpbGUgZXQgaGlzdG9ncmFtbWVzIGRlIGZyw6lxdWVuY2VzDQoNClBvdXIgY2hhcXVlIHZhcmlhYmxlLCBsZSBwcmVtaWVyIGdyYXBoaXF1ZSAow6AgZ2F1Y2hlKSBpbGx1c3RyZSBsYSBkaXN0cmlidXRpb24gb2JzZXJ2w6llIGRlcyB2YWxldXJzIHBhciB2YXJpYWJsZSBwYXIgZGVzIHBvaW50cyBldCBsYSBkaXN0cmlidXRpb24gbm9ybWFsZSB0aMOpb3JpcXVlIGNhbGN1bMOpZSDDoCBwYXJ0aXIgZGVzIHBhcmFtw6h0cmVzIGRlIGxhIGRpc3RyaWJ1dGlvbiBvYnNlcnbDqWUgcGFyIHVuZSBkcm9pdGUuIFBsdXMgbGVzIHZhbGV1cnMgb2JzZXJ2w6llcyBzb250IHBvc2l0aW9ubsOpZXMgc3VyIGxhIGRyb2l0ZSwgcGx1cyBjZWxsZXMtY2kgc29udCBkaXN0cmlidcOpZXMgc2Vsb24gbGEgbG9pIG5vcm1hbGUuDQoNCkxlIGRldXhpw6htZSBncmFwaGlxdWUgKGF1IG1pbGlldSkgaWxsdXN0cmUgcGFyIHVuIGhpc3RvZ3JhbW1lIGxhIGRpc3RyaWJ1dGlvbiBkZXMgZnLDqXF1ZW5jZXMgZGVzIHZhbGV1cnMgb2JzZXJ2w6llcyBwYXIgdGF4b24uIENldCBoaXN0b2dyYW1tZSBpbGx1c3RyZSDDqWdhbGVtZW50IGxhIHZhbGV1ciBtb3llbm5lIHBhciB2YXJpYWJsZSBwYXIgdW5lIGxpZ25lIHBsZWluZSBhaW5zaSBxdWUgbCfDqWNhcnQtdHlwZSBkZXMgdmFyaWFibGVzIHBhciBkZXV4IGxpZ25lcyBwb2ludGlsbMOpZXMuDQoNCkxlIHRyb2lzacOobWUgZ3JhcGhpcXVlICjDoCBkcm9pdGUpIGlsbHVzdHJlIGxhIGRpc3RyaWJ1dGlvbiBkZXMgZnLDqXF1ZW5jZXMgZGVzIHZhbGV1cnMgb2JzZXJ2w6llcyBwYXIgdmFyaWFibGUgYXlhbnQgc3ViaWVzIHVuZSB0cmFuc2Zvcm1hdGlvbiBsb2dhcml0aG1pcXVlLiBTaSBsYSBkaXN0cmlidXRpb24gZGVzIGRvbm7DqWVzIHN1ciBjZSBkZXJuaWVyIGdyYXBoaXF1ZSBzZW1ibGUgcmVzc2VtYmxlciBkYXZhbnRhZ2Ugw6AgdW5lIGRpc3RyaWJ1dGlvbiBub3JtYWxlLCB1bmUgdHJhbnNmb3JtYXRpb24gbG9nYXJpdGhtaXF1ZSBkZXMgZG9ubsOpZXMgcG91cnJhaXQgw6p0cmUgbsOpY2Vzc2FpcmUuIENldCBoaXN0b2dyYW1tZSBpbGx1c3RyZSDDqWdhbGVtZW50IGxhIHZhbGV1ciBtb3llbm5lIHBhciB2YXJpYWJsZSBwYXIgdW5lIGxpZ25lIHBsZWluZSBhaW5zaSBxdWUgbCfDqWNhcnQtdHlwZSBkZXMgdmFyaWFibGVzIHBhciBkZXV4IGxpZ25lcyBwb2ludGlsbMOpZXMuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI0RpYWdyYW1tZXMgUXVhbnRpbGUtUXVhbnRpbGUgZXQgaGlzdG9ncmFtbWVzIGRlIGZyw6lxdWVuY2VzDQoNCmZvciAoaSBpbiAxOm5jb2woZGF0YXNldC5FTlYpKXsNCm5vcm0ubWVhbiA8LSBtZWFuKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSkNCm5vcm0uc2QgPC0gc2Qod2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpKQ0Kbm9ybS5uIDwtIGxlbmd0aCh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpDQpub3JtLmJpbiA8LSBjZWlsaW5nKG1heCh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpLSBtaW4od2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpKS9uY2xhc3MuU3R1cmdlcyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKQ0KDQpwYXIobWZyb3cgPSBjKDEsMyksIG9tYT1jKDEsMSwyLDEpKQ0KDQpxcW5vcm0od2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpLCBtYWluID0gIkRpYWdyYW1tZSBRdWFudGlsZS1RdWFudGlsZSIsIHhsYWIgPSAiUXVhbnRpbGVzIGRlIGxhIGxvaSBub3JtYWxlIiwgeWxhYiA9ICJRdWFudGlsZXMgbm9ybWFsaXPDqXMgb2JzZXJ2w6lzIikNCnFxbGluZSh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSksbHR5ID0gMikNCg0KaGlzdC5hYiA8LSBoaXN0KGFzLm51bWVyaWModW5saXN0KGRhdGFzZXQuRU5WWyxpXSkpLCBicmVha3MgPSAiU3R1cmdlcyIsIHhsYWIgPSAiVmFsZXVyIiwgeWxhYiA9ICJGcsOpcXVlbmNlIiwgbWFpbiA9ICJGcsOpcXVlbmNlcyBkJ2Fib25kYW5jZXMiKQ0KeGZpdCA8LSBzZXEobWluKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSksIG1heCh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpLCBsZW5ndGg9bm9ybS5uKQ0KeWZpdF9kZW5zaXR5IDwtIGRub3JtKHhmaXQsIG1lYW4gPSBub3JtLm1lYW4sIHNkPW5vcm0uc2QpDQp5Zml0X2ZyZXEgPC0geWZpdF9kZW5zaXR5KmRpZmYoaGlzdC5hYiRtaWRzWzE6Ml0pKm5vcm0ubg0KbGluZXMoeGZpdCwgeWZpdF9mcmVxLCBjb2w9InJlZCIsIGx3ZD0xKQ0KICBhYmxpbmUodiA9IG5vcm0ubWVhbiwgY29sID0gImJsdWUiKSArDQogIGFibGluZSh2ID0gbm9ybS5tZWFuICsgbm9ybS5zZCwgbHR5ID0gMiwgY29sID0gImJsdWUiKSArDQogIGFibGluZSh2ID0gbm9ybS5tZWFuIC0gbm9ybS5zZCwgbHR5ID0gMiwgY29sID0gImJsdWUiKQ0KDQpub3JtLm1lYW4ubG9nIDwtIG1lYW4obG9nKHdoaWNoKCFpcy5uYShkYXRhc2V0LkVOVlssaV0pKSkpDQpub3JtLnNkLmxvZyA8LSBzZChsb2cod2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpKSkNCm5vcm0ubi5sb2cgPC0gbGVuZ3RoKGxvZyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKQ0Kbm9ybS5iaW4ubG9nIDwtIGNlaWxpbmcobWF4KGxvZyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKS0gbWluKGxvZyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKS9uY2xhc3MuU3R1cmdlcyhsb2cod2hpY2goIWlzLm5hKGRhdGFzZXQuRU5WWyxpXSkpKSkpDQogIA0KaGlzdC5hYi4yIDwtIGhpc3QobG9nKGFzLm51bWVyaWModW5saXN0KGRhdGFzZXQuRU5WWyxpXSkpKSwgYnJlYWtzID0gIlN0dXJnZXMiLCB4bGFiID0gIkxvZyhBYm9uZGFuY2UpIiwgeWxhYiA9ICJGcsOpcXVlbmNlIiwgbWFpbiA9ICJGcsOpcXVlbmNlcyBkJ2Fib25kYW5jZXMgKGxvZykiKQ0KeGZpdCA8LSBzZXEobWluKGxvZyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKSwgbWF4KGxvZyh3aGljaCghaXMubmEoZGF0YXNldC5FTlZbLGldKSkpKSwgbGVuZ3RoPW5vcm0ubi5sb2cpDQp5Zml0X2RlbnNpdHkgPC0gZG5vcm0oeGZpdCwgbWVhbiA9IG5vcm0ubWVhbi5sb2csIHNkPW5vcm0uc2QubG9nKQ0KeWZpdF9mcmVxIDwtIHlmaXRfZGVuc2l0eSpkaWZmKGhpc3QuYWIuMiRtaWRzWzE6Ml0pKm5vcm0ubi5sb2cNCmxpbmVzKHhmaXQsIHlmaXRfZnJlcSwgY29sPSJyZWQiLCBsd2Q9MSkNCiAgYWJsaW5lKHYgPSBub3JtLm1lYW4ubG9nLCBjb2wgPSAiYmx1ZSIpICsNCiAgYWJsaW5lKHYgPSBub3JtLm1lYW4ubG9nICsgbm9ybS5zZC5sb2csIGx0eSA9IDIsIGNvbCA9ICJibHVlIikgKw0KICBhYmxpbmUodiA9IG5vcm0ubWVhbi5sb2cgLSBub3JtLnNkLmxvZywgbHR5ID0gMiwgY29sID0gImJsdWUiKQ0KICBtdGV4dChjb2xuYW1lcyhkYXRhc2V0LkVOVltpXSksIGNleCA9IDEuMiwgb3V0ZXIgPSBUUlVFKQ0KDQogIH0NCg0KYGBgDQoNCg0KIyMjQm/DrnRlcyDDoCBtb3VzdGFjaGVzIGRlcyB2YWxldXJzIG9ic2VydsOpZXMgcGFyIHZhcmlhYmxlIGVudmlyb25uZW1lbnRhbGUNCg0KUG91ciBjaGFxdWUgdmFyaWFibGUsIGxhIHByZW1pw6hyZSBib8OudGUgw6AgbW91c3RhY2hlcyAow6AgZ2F1Y2hlKSBpbGx1c3RyZSBsYSBkaXN0cmlidXRpb24gZGVzIHZhbGV1cnMgb2JzZXJ2w6llcyBkYW5zIGxlIGZpY2hpZXIgZGUgZG9ubsOpZXMgZXQgbGEgZGV1eGnDqG1lIGJvw650ZSDDoCBtb3VzdGFjaGVzICjDoCBkcm9pdGUpIGlsbHVzdHJlIGxhIGRpc3RyaWJ1dGlvbiBkZXMgdmFsZXVycyBvYnNlcnbDqWVzIGRhbnMgbGUgZmljaGllciBkZSBkb25uw6llcyBheWFudCBzdWJpZXMgdW5lIHRyYW5zZm9ybWF0aW9uIGxvZ2FyaXRobWlxdWUuDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0Jvw650ZXMgw6AgbW91c3RhY2hlcyBkZXMgdmFsZXVycyBvYnNlcnbDqWVzIHBhciB2YXJpYWJsZSBkJ2hhYml0YXQNCg0KZm9yKGkgaW4gMTpuY29sKGRhdGFzZXQuRU5WKSl7DQpib3guYWIuMSA8LSBxcGxvdCh5ID0gZGF0YXNldC5FTlZbLGldLCB4ID0gIiIsIGdlb20gPSAiYm94cGxvdCIsIHlsYWIgPSAiVmFsZXVyIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZShwYXN0ZSgiQm9pdGUgw6AgbW91c3RhY2hlcyBwb3VyXG4iLCBjb2xuYW1lcyhkYXRhc2V0LkVOVltpXSkpKQ0KYm94LmFiLjIgPC0gcXBsb3QoeSA9IGRhdGFzZXQuRU5WWyxpXSwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gIkxvZyhWYWxldXIpIiwgbG9nID0gInkiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBnZ3RpdGxlKHBhc3RlKCJCb2l0ZSDDoCBtb3VzdGFjaGVzIHBvdXJcbiIsIGNvbG5hbWVzKGRhdGFzZXQuRU5WW2ldKSkpDQoNCmdyaWQuYXJyYW5nZShib3guYWIuMSwgYm94LmFiLjIsIG5jb2wgPSAyKQ0KfQ0KDQpgYGANCg0KDQojIyNUZXN0cyBkZSBub3JtYWxpdMOpDQoNCkxlcyByw6lzdWx0YXRzIHN1aXZhbnRzIHByw6lzZW50ZW50IGxlIHLDqXN1bHRhdCBvYnRlbnUgcGFyIHVuIHRlc3QgZGUgU25vd3MgYXBwbGlxdcOpIHN1ciBjaGFxdWUgdmFyaWFibGUgZHUgZmljaGllciBkZSBkb25uw6llcy4gVW5lIHZhbGV1ciBkZSBQIChwLXZhbHVlKSBpbmbDqXJpZXVyZSDDoCAwLjA1IGluZGlxdWUgcXUnaWwgbidlc3QgcGFzIHBvc3NpYmxlIGRlIHN1cHBvc2VyIHF1ZSBsYSBkaXN0cmlidXRpb24gZGVzIGRvbm7DqWVzIHN1aXQgbGEgbG9pIG5vcm1hbGUgYXZlYyB1bmUgcHJvYmFiaWxpdMOpIGRlIDk1JS4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1Rlc3RzIGRlIG5vcm1hbGl0w6kgZGUgU25vd3MgcGFyIHZhcmlhYmxlDQoNCmFwcGx5KGRhdGFzZXQuRU5WLCAyLCBTbm93c1BlbnVsdGltYXRlTm9ybWFsaXR5VGVzdCkNCg0KI1VuZSB2YWxldXIgZGUgUCAocC12YWx1ZSkgaW5mw6lyaWV1cmUgw6AgMC4wNSBpbmRpcXVlIHF1J2lsIG4nZXN0IHBhcyBwb3NzaWJsZSBkZSBjb25zaWTDqXJlciBxdWUgbGVzIGRvbm7DqWVzIHN1aXZlbnQgdW5lIGRpc3RyaWJ1dGlvbiBub3JtYWxlLiANCg0KYGBgDQoNCg0KIyNDb2xsaW7DqWFyaXTDqSBkZXMgdmFyaWFibGVzDQoNCiMjI01hdHJpY2UgZGUgZGlhZ3JhbW1lcyBkZSBkaXNwZXJzb24NCg0KTGEgbWF0cmljZSBkZSBkaWFncmFtbWVzIGRlIGRpc3BlcnNpb24gc3VpdmFudGUgaWxsdXN0cmUgbGEgcmVsYXRpb24gcXVpIGV4aXN0ZSBlbnRyZSBkZXMgcGFpcnMgZGUgdmFyaWFibGVzLiBFbGxlIHBlcm1ldCBub3RhbW1lbnQgZGUgZMOpdGVjdGVyIGxhIHByw6lzZW5jZSBkZSBjb3Jyw6lsYXRpb25zIGVudHJlIGRlcyB2YXJpYWJsZXMuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI01hdHJpY2UgZGUgY29ycsOpbGF0aW9uIGVudHJlIGxlcyB2YXJpYWJsZXMNCg0KZGF0YXNldC5FTlZbaXMubmEoZGF0YXNldC5FTlYpXSA8LSAwDQoNCkFsbFMgPC0gbmFtZXMoZGF0YXNldC5FTlYpDQpFbnYgPC0gZGF0YXNldC5FTlZbLEFsbFNdDQoNClBsb3RNYXRyaXgoRW52LCBwYW5lbCA9IHBhbmVsLnNtb290aCkNCg0KZGF0YXNldC5FTlZbZGF0YXNldC5FTlYgPT0gMF0gPC0gTkENCg0KYGBgDQoNCg0KIyMjSW5kw6lwZW5kYW5jZSB0ZW1wb3JlbGxlIGRlcyB2YXJpYWJsZXMNCg0KUG91ciBjaGFxdWUgdmFyaWFibGUsIGxlIHByZW1pZXIgZ3JhcGhpcXVlIChlbiBoYXV0IMOgIGdhdWNoZSkgaWxsdXN0cmUgbGEgdmFsZXVyIG9ic2VydsOpZSBkZXMgZG9ubsOpZXMgc2Vsb24gbGV1ciBhbm7DqWUgZCfDqWNoYW50aWxsb25uYWdlLiBMZSBkZXV4acOobWUgZ3JhcGhpcXVlIChlbiBoYXV0IMOgIGRyb2l0ZSkgaWxsdXN0cmUgbGVzIHRlbmRhbmNlcyBvYnNlcnbDqWVzIGRlIHZhcmlhdGlvbnMgZGVzIHZhbGV1cnMgZGVzIGRvbm7DqWVzIGRhbnMgbGUgdGVtcHMuIExlIHRyb2lzacOobWUgZ3JhcGhpcXVlIChlbiBiYXMgw6AgZ2F1Y2hlKSBpbGx1c3RyZSBsZXMgcHLDqXZpc2lvbnMgZnV0dXJlcyBkZSB2YXJpYXRpb25zIGRlcyB2YWxldXJzIGRhbnMgbGUgdGVtcHMuIFN1ciBjZSBncmFwaGlxdWUgbGEgbGlnbmUgYmxldWUgY29ycmVzcG9uZCDDoCBsYSB0ZW5kYW5jZSBhdHRlbmR1ZSBtb3llbm5lIGRlIHZhcmlhdGlvbnMgZGFucyBsZSB0ZW1wcywgbGEgem9uZSBncmlzZSBmb25jw6llIGNvcnJlc3BvbmQgw6AgdW4gaW50ZXJ2YWxsZSBkZSBjb25maWFuY2UgZGUgODAlIGV0IGxhIHpvbmUgZ3Jpc2UgcMOibGUgY29ycmVzcG9uZCDDoCB1biBpbnRlcnZhbGxlIGRlIGNvbmZpYW5jZSBkZSA5NSUuIExlIHF1YXRyacOobWUgZ3JhcGhpcXVlIChlbiBiYXMgw6AgZHJvaXRlKSBpbGx1c3RyZSBsJ2F1dG9jb3Jyw6lsYXRpb24gZGUgc8OpcmllcyB0ZW1wb3JlbGxlcyAoQUNGKS4gVW5lIHZhbGV1ciBkJ2F1dG9jb3Jyw6lsYXRpb24gIHN1cMOpcmlldXJlIMOgIGwnaW50ZXJ2YWxsZSBkZSBjb25maWFuY2UgZGUgOTUlIGlsbHVzdHLDqWUgcGFyIGxhIGxpZ25lIHBvaW50aWxsw6llIGluZGlxdWUgdW5lIHBvc3NpYmxlIGTDqXBlbmRhbmNlIGVudHJlIGxhIHZhcmlhYmxlIGV0IGxhIHDDqXJpb2RlIGRlIGwnYW5uw6llICh0ZW1wcykuIFBhciBleGVtcGxlLCB1bmUgY2VydGFpbmUgdmFsZXVyIGQndW5lIHZhcmlhYmxlIG9ic2VydsOpZSBsb3JzIGQndW5lIGFubsOpZSBwcsOpY2lzZSBwb3VycmFpdCDDqnRyZSBleHBsaXF1w6llIHBhciB1biBjZXJ0YWluIMOpdsOpbmVtZW50IGRhdGFudCBkJ3VuZSBhbm7DqWUgYW50w6lyaWV1cmUgKGTDqWNhbGFnZSBkYW5zIGxlIHRlbXBzIGVuIGFubsOpZXMpLiBJbCBlc3Qgw6Agbm90ZXIgcXVlIGwnYXV0b2NvcnLDqWxhdGlvbiBhdSB0ZW1wcyBkZSBkw6ljYWxhZ2UgMCBlc3QsIHBhciBkw6lmaW5pdGlvbiwgw6lnYWxlIMOgIDEuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojSW5kw6lwZW5kYW5jZSB0ZW1wb3JlbGxlIGRlcyB2YXJpYWJsZXMNCg0KZGF0YXNldC5FTlYyIDwtIGxlZnRfam9pbihkYXRhc2V0LkVOVjIsIGRhdGFzZXQuTkFNMlssYygicm93bmFtZXMiLCAiU2FtcGxlRGF0ZSIpXSwgYnkgPSAicm93bmFtZXMiKQ0KDQpkYXRhc2V0LkVOVjJbaXMubmEoZGF0YXNldC5FTlYyKV0gPC0gMA0KDQpmb3IoaSBpbiAyOihuY29sKGRhdGFzZXQuRU5WMiktNCkpew0KICBwYXIobWZyb3cgPSBjKDIsIDIpLCBvbWEgPSBjKDEsMSwyLDEpKQ0KICBncmFwaC50aW1lIDwtIHBsb3QoZGF0YXNldC5FTlYyJFNhbXBsZURhdGUsIGRhdGFzZXQuRU5WMlssaV0sIHhsYWIgPSAiQW5uw6llIiwgeWxhYiA9ICJWYWxldXIiLCBtYWluID0gIlZhbGV1cnMgb2JzZXJ2w6llcyIpDQoNCiAgZ3JhcGgudGltZTIgPC0gdHMoZGF0YXNldC5FTlYyWyxpXSwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDA1LTAxLTAxKSwgZW5kID0gYygyMDE2LTAxLTAxKSkNCiAgcGxvdChncmFwaC50aW1lMiwgeGxhYiA9ICJBbm7DqWUiLCB5bGFiID0gIlZhbGV1ciIsIG1haW4gPSAiVmFsZXVycyBwcsOpZGl0ZXMiKQ0KDQogIGF1dG8uYXJpbWEgPC0gYXV0by5hcmltYShncmFwaC50aW1lMikNCiAgZ3JhcGguYXV0by5hcmltYSA8LSBwbG90KGZvcmVjYXN0KGF1dG8uYXJpbWEsIGggPSAxMjApLCBtYWluID0gIlByw6l2aXNpb24gKEFSSU1BKSIsIHhsYWIgPSAiQW5uw6llIikNCiAgDQogIGdyYXBoLmxhZyA8LSBhY2YoZ3JhcGgudGltZTIsIHhsYWIgPSAiRMOpY2FsYWdlIChhbm7DqWVzKSIsIHlsYWIgPSAiQUNGIiwgbWFpbiA9ICJGb25jdGlvbiBkJ2F1dG9jb3Jyw6lsYXRpb24iLCB5bGltID0gYygwLCAxKSkNCiAgbXRleHQoY29sbmFtZXMoZGF0YXNldC5FTlYyW2ldKSwgY2V4ID0gMS4yLCBvdXRlciA9IFRSVUUpDQp9DQoNCmRhdGFzZXQuRU5WMltkYXRhc2V0LkVOVjIgPT0gMF0gPC0gTkENCg0KI3JtKGRhdGFzZXQuTkFNMikNCg0KYGBgDQoNClBsdXMgYmFzIHNlIHRyb3V2ZW50IGxlcyByw6lzdWx0YXRzIGR1IHRlc3QgZGUgbGEgc3RhdGlzdGlxdWUgZGUgTGp1bmfigJNCb3ggYXBwbGlxdcOpIHN1ciBjaGFxdWUgdmFyaWFibGUgZXQgY29uZmlybWVudCBsZXMgcsOpc3VsdGF0cyBpbGx1c3Ryw6lzIHBhciBsZXMgZ3JhcGhpcXVlcyBwcsOpY8OpZGVudHMuIFVuZSB2YWxldXIgZGUgUCAocC12YWx1ZSkgaW5mw6lyaWV1cmUgw6AgMC4wNSBwZXJtZXQgZGUgc3VwcG9zZXIgcXVlIGxlcyB2YWxldXJzIHLDqXNpZHVlbGxlcyBkJ3VuZSB2YXJpYWJsZSBkw6lwZW5kZW50IGRlIGxhIHDDqXJpb2RlIGRlIGwnYW5uw6llICh0ZW1wcykuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI0luZMOpcGVuZGFuY2UgdGVtcG9yZWxsZSBkZXMgdmFyaWFibGVzIChzdWl0ZSkNCg0KZGF0YXNldC5FTlYyW2lzLm5hKGRhdGFzZXQuRU5WMildIDwtIDANCg0KZm9yKGkgaW4gMjoobmNvbChkYXRhc2V0LkVOVjIpLTQpKXsNCiAgZ3JhcGgudGltZTIgPC0gdHMoZGF0YXNldC5FTlYyWyxpXSwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDA1LTAxLTAxKSwgZW5kID0gYygyMDE2LTAxLTAxKSkNCiAgYXV0by5hcmltYSA8LSBhdXRvLmFyaW1hKGdyYXBoLnRpbWUyKQ0KICBib3ggPC0gbGFwcGx5KDE6MjAsIGZ1bmN0aW9uKGopIEJveC50ZXN0IChyZXNpZChhdXRvLmFyaW1hKSwgbGFnID0gaiwgdHlwZT0iTGp1bmciKSkNCiAgcHJpbnQocGFzdGUoY29sbmFtZXMoZGF0YXNldC5FTlYyW2ldKSkpICANCiAgcHJpbnQoYm94KQ0KfQ0KDQpkYXRhc2V0LkVOVjJbZGF0YXNldC5FTlYyID09IDBdIDwtIE5BDQoNCmBgYA0KDQojI05vdGVzIHN1ciBsZXMgdmVyc2lvbnMNCioqUXVvaSBkZSBub3V2ZWF1LCBtaXMgw6Agam91ciBvdSBjb3JyaWfDqSBkYW5zIGNldHRlIHZlcnNpb24qKg0KDQoqKioNCiFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9sb2dvX25ldy5wbmcpIE5vdXZlYXUgJm5ic3A7Jm5ic3A7Jm5ic3A7ICAgIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2xvZ29fdXBkYXRlZC5wbmcpIE1pc2Ugw6Agam91ciAmbmJzcDsmbmJzcDsmbmJzcDsgICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9sb2dvX2ZpeGVkLnBuZykgQ29ycmlnw6kNCg0KKioqDQoNCioqUkNCQV92dl9oYWJpdGF0LlJtZCBWZXJzaW9uIDEuMSDigJQgMWVyIG5vdmVtYnJlIDIwMTcqKg0KDQpDZXR0ZSB2ZXJzaW9uIHByw6lzZW50ZSBkZXMgc3VnZ2VzdGlvbnMgZCdhY3Rpb25zIGVuIHJhcHBvcnQgYXZlYyBsYSB2w6lyaWZpY2F0aW9uIGV0IHZhbGlkYXRpb24gZGVzIGRvbm7DqWVzIGfDqW7DqXJhbGVzLg0KDQohW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vbG9nb19uZXcucG5nKSAgICoqQWN0aW9ucyoqLg0KDQoqKlJDQkFfdnZfaGFiaXRhdC5SbWQgVmVyc2lvbiAxLjAg4oCUIDE4IGFvw7t0IDIwMTcqKg0KDQpWZXJzaW9uIGluaXRpYWxlIGRlIGwnb3V0aWwgZGUgdsOpcmlmaWNhdGlvbiBldCB2YWxpZGF0aW9uIGRlcyBkb25uw6llcyBkJ2hhYml0YXQuDQoNCiFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9sb2dvX25ldy5wbmcpICAgKipQcmVtacOocmUgdmVyc2lvbioqLg0KDQoNCioqKg0KDQpEw6l2ZWxvcHDDqSBwYXIgW01hcnRpbiBKZWFuXShtYWlsdG86bWFydGluLmplYW5AY2FuYWRhLmNhKSBldCBFdmVseW5lIFBhcXVldHRlLUJvaXNjbGFpcg0K